Копіювати базу даних геоданих на ftp-сайт на локальний диск за допомогою Python?


11

На ftp-сайті є файлова база даних, яку я хотів би завантажити із сценарієм Python. Зараз я думаю, що один із способів зробити це - скопіювати ftp geodatabase на базу даних geodata на моєму комп’ютері. Нижче описаний сценарій, який я розпочав. Хтось знає, як я можу змінити цей скрипт, щоб отримати 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 збирається використовувати його як своє місцезнаходження.
1212

4
Чи розглядали ви, як застебнути свою геодану в базу даних? Майже немає причин для створення нестисненої бази даних на веб-сайті FTP.
blah238

можна встановити базу геоданих на ftp-сайті як робочу область без необхідності завантажувати її?
geogeek

3
@geogeek Ні, це не так
blah238

1
@PattyJula Сьогодні довелося написати ftp-скрипт. Виявляється, вбудований ftplib - це біль за навігацію по ієрархії каталогів. Натомість я зробив це з ftputil , який я б рекомендував, якщо ви коли-небудь спробуєте це ще раз.
om_henners

Відповіді:


9

У цьому випадку вам не потрібно використовувати бібліотеки arcpy для копіювання бази даних. Натомість ви дивитесь на копіювання файлів через FTP-з'єднання, що можна зробити за допомогою retrbinaryкоманди ftplib .

Також зауважте, що файлова система розглядає бази даних геоданих як об'єкти папок із набором файлів всередині них. тобто вони не є єдиним бінарним файлом, який можна перенести одним зверненням за допомогою 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! Мені довелося змінити одну або дві незначні речі з вашим кодом, незабаром я опублікую свій остаточний сценарій.
Патті Джула
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.