¿Copiando la geodatabase de archivos en el sitio ftp al disco local usando Python?

11

Hay una geodatabase de archivos en un sitio ftp que me gustaría descargar con un script de Python. En este momento estoy pensando que una forma de hacerlo es copiar la geodatabase ftp a una geodatabase en mi computadora. A continuación se muestra el guión que he comenzado. ¿Alguien sabe cómo puedo alterar este script para obtener ftp gdb? Gracias


A continuación se muestra mi código de trabajo final basado en la respuesta proporcionada por @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
fuente
A menos que lo haya pasado por alto, ¿está configurando el entorno de trabajo en algún lugar? De cualquier manera, la variable copy_gdb la usará como su ubicación.
AHigh
44
¿Has considerado comprimir tu geodatabase en un archivo ZIP? Casi no hay razón para tener una geodatabase sin comprimir en un sitio FTP.
blah238
¿Es posible establecer una geodatabase en el sitio ftp como espacio de trabajo sin la necesidad de descargarla?
geogeek
3
@geogeek No, no lo es ...
blah238
1
@PattyJula Tuve que escribir un script ftp hoy. Resulta que el ftplib incorporado es una molestia para navegar por una jerarquía de directorios. En cambio, lo hice con ftputil , que recomendaría si alguna vez volviera a intentarlo.
om_henners

Respuestas:

9

En este caso, no necesita usar las bibliotecas arcpy para copiar la geodatabase. En cambio, está buscando copiar archivos a través de una conexión ftp, lo que puede hacer con el retrbinarycomando ftplib .

También tenga en cuenta que el sistema de archivos trata las geodatabases como objetos de carpeta con un conjunto de archivos dentro de ellas. es decir, no son un solo archivo binario que se puede transferir de una vez usando ftplib.

Entonces, lo que realmente quiere hacer es crear una carpeta local llamada data.gdb, y luego en el servidor ftp recorre todos los archivos hydro.gdby los descarga. Algo como lo siguiente debería funcionar (con un poco de código tomado de esta respuesta de desbordamiento de pila, ya que no conozco muy bien 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
fuente
1
Eso funciono. Muchas gracias om_henners! Tuve que cambiar una o dos cosas menores con su código, publicaré mi script final pronto.
Patty Jula