Copie de la géodatabase fichier sur le site ftp sur le disque local à l'aide de Python?


11

Il y a une géodatabase fichier sur un site ftp que je voudrais télécharger avec un script Python. En ce moment, je pense qu'une façon de le faire est de copier la géodatabase ftp dans une géodatabase sur mon ordinateur. Voici le script que j'ai commencé. Est-ce que quelqu'un sait comment je peux modifier ce script pour obtenir ftp gdb? Je vous remercie


Ci-dessous est mon code de travail final basé sur la réponse @om_hennners fournie.

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"

À moins que je ne l'ai oublié, définissez-vous l'espace de travail de l'environnement n'importe où? Quoi qu'il en soit, la variable copy_gdb va l'utiliser comme emplacement.
AHigh

4
Avez-vous envisagé de compresser votre géodatabase dans un fichier ZIP? Il n'y a presque aucune raison d'avoir une géodatabase non compressée sur un site FTP.
blah238

est-il possible de définir une géodatabase sur un site ftp comme espace de travail sans avoir besoin de la télécharger?
geogeek

3
@geogeek Non, ce n'est pas ...
blah238

1
@PattyJula J'ai dû écrire un script ftp aujourd'hui. Il s'avère que le ftplib intégré est pénible pour naviguer dans une hiérarchie de répertoires. Au lieu de cela, je l'ai fait avec ftputil , que je recommanderais si vous deviez réessayer.
om_henners

Réponses:


9

Dans ce cas, vous n'avez pas besoin d'utiliser les bibliothèques arcpy pour copier la géodatabase. Au lieu de cela, vous envisagez de copier des fichiers via une connexion ftp, ce que vous pouvez faire avec la retrbinarycommande ftplib .

Notez également que le système de fichiers traite les géodatabases comme des objets de dossier avec un ensemble de fichiers à l'intérieur. c'est-à-dire qu'ils ne sont pas un seul fichier binaire qui peut être transféré en une seule fois en utilisant ftplib.

Donc, vraiment, ce que vous voulez faire est de créer un dossier local appelé data.gdb, puis sur le serveur ftp, boucle tous les fichiers hydro.gdbet téléchargez-les. Quelque chose comme ce qui suit devrait fonctionner (avec un peu de code emprunté à cette réponse de débordement de pile car je ne connais pas très 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"

1
Ça a marché. Merci beaucoup om_henners! J'ai dû changer une ou deux petites choses avec votre code, je posterai bientôt mon script final.
Patty Jula
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.