Python을 사용하여 FTP 사이트의 파일 지오 데이터베이스를 로컬 디스크에 복사합니까?


11

파이썬 스크립트로 다운로드하려는 ftp 사이트에 파일 지오 데이터베이스가 있습니다. 현재이 작업을 수행하는 한 가지 방법은 ftp 지오 데이터베이스를 내 컴퓨터의 지오 데이터베이스에 복사하는 것입니다. 아래는 내가 시작한 스크립트입니다. ftp gdb를 얻도록이 스크립트를 어떻게 변경할 수 있는지 아는 사람이 있습니까? 감사합니다


아래는 @om_hennners가 제공 한 답변을 기반으로 한 최종 작업 코드입니다.

import arcpy, os, sys
from arcpy import env
arcpy.env.overwriteOutput = True
from ftplib import FTP

directory = "/group/geodb" #location of gdb on ftp
folder = "D:\\temp\\" 
out_gdb = "data.gdb"
out_path = folder + os.sep + out_gdb
copy_gdb = "hydro.gdb" # This is the gdb I would like to copy from the ftp  site
ftp = FTP("10.4.2.22")
ftp.login("user", "pass")

ftp.cwd(os.path.join(directory, copy_gdb))
print "Changed to " + os.path.join(directory, copy_gdb)

filenames = ftp.nlst()
print filenames

print "starting to write"
for f in filenames:
    with open(os.path.join(out_path, f), 'wb') as local_file:
    ftp.retrbinary('RETR '+ f, local_file.write)      


ftp.close()
print "closed ftp connection"

내가 간과하지 않는 한 어디에서나 환경 작업 공간을 설정하고 있습니까? copy_gdb 변수는 변수를 해당 위치로 사용합니다.
AHigh

4
지오 데이터베이스를 ZIP 파일로 압축하는 것을 고려 했습니까? FTP 사이트에서 압축되지 않은 지오 데이터베이스를 가질 이유는 거의 없습니다.
blah238

ftp 사이트에서 지오 데이터베이스를 다운로드 할 필요없이 작업 공간으로 설정할 수 있습니까?
geogeek

3
@geogeek 아니오, 그렇지 않습니다 ...
blah238

1
@PattyJula 오늘 ftp 스크립트를 작성해야했습니다. 내장 된 ftplib는 디렉토리 계층 구조를 탐색하는 데 어려움을 겪습니다. 대신 ftputil 을 사용하여 다시 시도하십시오.
om_henners

답변:


9

이 경우 지오 데이터베이스를 복사하기 위해 arcpy 라이브러리를 사용할 필요가 없습니다. 대신 ftplib retrbinary명령 을 사용하여 ftp 연결을 통해 파일을 복사하려고합니다 .

또한 파일 시스템은 지오 데이터베이스를 파일 세트가 포함 된 폴더 객체로 취급합니다. 즉, ftplib를 사용하여 한 번에 전송할 수있는 단일 바이너리 파일이 아닙니다.

따라서 실제로 원하는 것은이라는 로컬 폴더 data.gdb를 만든 다음 ftp 서버에서 모든 파일을 반복하여 hydro.gdb다운로드합니다. 다음과 같은 것이 작동해야합니다 ( ftplib을 잘 모르기 때문에이 스택 오버플로 답변 에서 빌린 약간의 코드 로) :

import os
import os.path
from ftplib import FTP

directory = "/group/geodb" #location of gdb on ftp
copy_gdb = "hydro.gdb" # This is the gdb I would like to copy from the ftp site

folder = "D:\\temp\\"
out_gdb = "data.gdb"
out_path = os.path.join(folder, out_gdb)

#First, create the out geodatabase as a folder
os.mkdir(out_path)

#FTP logon
ftp = FTP("10.4.2.22")
ftp.login("user", "pass")

#Again, treat the gdb as a folder and navigate there
ftp.cwd(os.path.join(directory, copy_gdb))
print "Changed to " + os.path.join(directory, copy_gdb)

#Now get a list of all files in the folder
filenames = ftp.nlst()
print filenames

#and loop through the filenames to download the files to your local 'gdb'
for f in filenames:
    with open(os.path.join(out_path, f), 'wb') as local_file:
        ftp.retrbinary('RETR '+ filename, local_file.write)

ftp.close()
print "closed ftp connection"

1
효과가있었습니다. om_henners 정말 감사합니다! 코드로 하나 또는 두 개의 사소한 것을 변경해야했습니다. 최종 스크립트를 곧 게시하겠습니다.
Patty Jula
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.