Kopieren der Datei-Geodatabase auf einer FTP-Site mit Python auf die lokale Festplatte?


11

Auf einer FTP-Site befindet sich eine Datei-Geodatabase, die ich mit einem Python-Skript herunterladen möchte. Im Moment denke ich, dass eine Möglichkeit, dies zu tun, darin besteht, die FTP-Geodatabase in eine Geodatabase auf meinem Computer zu kopieren. Unten ist das Skript, das ich gestartet habe. Weiß jemand, wie ich dieses Skript ändern kann, damit ich FTP-GDB erhalte? Vielen Dank


Unten ist mein endgültiger Arbeitscode, der auf der Antwort @om_hennners basiert.

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"

Wenn Sie es nicht übersehen haben, stellen Sie den Arbeitsbereich der Umgebung irgendwo ein? In beiden Fällen wird die Variable copy_gdb sie als Speicherort verwenden.
AHigh

4
Haben Sie darüber nachgedacht, Ihre Geodatabase in eine ZIP-Datei zu komprimieren? Es gibt fast keinen Grund, eine unkomprimierte Geodatabase auf einer FTP-Site zu haben.
blah238

Ist es möglich, eine Geodatabase auf einer FTP-Site als Arbeitsbereich festzulegen, ohne sie herunterladen zu müssen?
Geogeek

3
@geogeek Nein, es ist nicht ...
blah238

1
@PattyJula Musste heute ein FTP-Skript schreiben. Es stellt sich heraus, dass die eingebaute ftplib ein Problem beim Navigieren in einer Verzeichnis-Hierarchie ist. Stattdessen habe ich es mit ftputil gemacht , was ich empfehlen würde, wenn Sie es jemals wieder versuchen würden.
om_henners

Antworten:


9

In diesem Fall müssen Sie die arcpy-Bibliotheken nicht zum Kopieren der Geodatabase verwenden. Stattdessen möchten Sie Dateien über eine FTP-Verbindung kopieren, was Sie mit dem retrbinaryBefehl ftplib tun können .

Beachten Sie außerdem, dass das Dateisystem Geodatabases als Ordnerobjekte mit einer Reihe von Dateien behandelt. Das heißt, es handelt sich nicht um eine einzelne Binärdatei, die mit ftplib auf einen Schlag übertragen werden kann.

Sie möchten also wirklich einen lokalen Ordner mit dem Namen erstellen data.gdbund dann auf dem FTP-Server alle Dateien durchlaufen hydro.gdbund sie herunterladen. So etwas wie das Folgende sollte funktionieren (mit ein bisschen Code, der aus dieser Stapelüberlauf-Antwort entlehnt wurde , da ich ftplib nicht sehr gut kenne):

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
Das hat funktioniert. Vielen Dank om_henners! Ich musste ein oder zwei kleinere Dinge mit Ihrem Code ändern, ich werde bald mein endgültiges Skript veröffentlichen.
Patty Jula
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.