Copia del file geodatabase sul sito ftp sul disco locale usando Python?


11

C'è un file geodatabase seduto su un sito ftp che vorrei scaricare con uno script Python. In questo momento sto pensando che un modo per farlo è copiare il geodatabase ftp in un geodatabase sul mio computer. Di seguito è riportato lo script che ho iniziato. Qualcuno sa come posso modificare questo script in modo da ottenere ftp gdb? Grazie


Di seguito è riportato il mio ultimo codice funzionante basato sulla risposta fornita da @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"

A meno che non lo abbia trascurato, stai impostando l'area di lavoro ambientale ovunque? In ogni caso, la variabile copy_gdb la utilizzerà come posizione.
AHigh

4
Hai considerato di comprimere il tuo geodatabase in un file ZIP? Non c'è quasi motivo di avere un geodatabase non compresso su un sito FTP.
blah238,

è possibile impostare un geodatabase sul sito ftp come area di lavoro senza la necessità di scaricarlo?
geogeek,

3
@geogeek No, non è ...
blah238,

1
@PattyJula Ho dovuto scrivere uno script ftp oggi. Si scopre che ftplib integrato è una seccatura per navigare in una directory dell'erarchia. Invece l'ho fatto con ftputil , che consiglierei se dovessi provare di nuovo.
om_henners,

Risposte:


9

In questo caso non è necessario utilizzare le librerie arcpy per copiare il geodatabase. Invece stai cercando di copiare i file attraverso una connessione ftp, cosa che puoi fare con il retrbinarycomando ftplib .

Si noti inoltre che il file system tratta i geodatabase come oggetti cartella con una serie di file al loro interno. cioè non sono un singolo file binario che può essere trasferito in un colpo solo usando ftplib.

Quindi davvero quello che vuoi fare è creare una cartella locale chiamata data.gdb, e quindi sul server ftp scorre tutti i file hydro.gdbe li scarica. Qualcosa di simile al seguente dovrebbe funzionare (con un po 'di codice preso in prestito da questa risposta di overflow dello stack poiché non conosco molto bene 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
Ha funzionato Grazie mille om_henners! Ho dovuto cambiare una o due cose minori con il tuo codice, pubblicherò presto il mio script finale.
Patty Jula,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.