Skopiować geobazę plików z witryny ftp na dysk lokalny przy użyciu Pythona?

11

Na stronie ftp znajduje się geobaza plików, którą chciałbym pobrać za pomocą skryptu Python. Obecnie myślę, że jednym ze sposobów jest skopiowanie geobazy ftp do geobazy na moim komputerze. Poniżej znajduje się skrypt, który rozpocząłem. Czy ktoś wie, jak mogę zmienić ten skrypt, aby uzyskać ftp gdb? Dziękuję Ci


Poniżej znajduje się mój końcowy, działający kod oparty na dostarczonej odpowiedzi @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"
Patty Jula
źródło
O ile go nie przeoczyłem, czy ustawiasz gdzieś środowisko pracy? Tak czy inaczej zmienna copy_gdb użyje jej jako swojej lokalizacji.
AHigh
4
Czy rozważałeś spakowanie swojej geobazy do pliku ZIP? Prawie nie ma powodu, aby mieć nieskompresowaną geobazę na stronie FTP.
blah238,
czy możliwe jest ustawienie geobazy na stronie ftp jako przestrzeni roboczej bez konieczności jej pobierania?
geogeek
3
@geogeek Nie, to nie jest ...
blah238
1
@PattyJula Musiałem dziś napisać skrypt ftp. Okazuje się, że wbudowany ftplib jest kłopotliwy w nawigacji po katalogu. Zamiast tego zrobiłem to z ftputilem , który poleciłbym, gdybyś kiedykolwiek spróbował tego ponownie.
om_henners

Odpowiedzi:

9

W takim przypadku nie musisz używać bibliotek Arcpy do kopiowania geobazy. Zamiast tego chcesz skopiować pliki przez połączenie ftp, co możesz zrobić za pomocą retrbinarypolecenia ftplib .

Należy również pamiętać, że system plików traktuje geobazy jako obiekty folderów z zestawem plików w nich zawartych. tzn. nie są pojedynczym plikiem binarnym, który można przenieść za jednym razem za pomocą ftplib.

Tak naprawdę to, co chcesz zrobić, to utworzyć folder lokalny o nazwie data.gdb, a następnie na serwerze ftp zapętla wszystkie pliki hydro.gdbi je pobiera. Powinno działać coś takiego (z odrobiną kodu zapożyczonego z odpowiedzi na przepełnienie stosu, ponieważ nie znam zbyt dobrze 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"
om_henners
źródło
1
To się udało. Dziękuję bardzo om_henners! Musiałem zmienić jedną lub dwie drobne rzeczy w twoim kodzie, wkrótce opublikuję mój ostatni skrypt.
Patty Jula,