Menyalin file geodatabase di situs ftp ke disk lokal menggunakan Python?

11

Ada file geodatabase yang duduk di situs ftp yang ingin saya unduh dengan skrip Python. Saat ini saya sedang berpikir salah satu cara untuk melakukan ini adalah menyalin geodatabase ftp ke geodatabase di komputer saya. Di bawah ini adalah skrip yang saya mulai. Adakah yang tahu bagaimana saya bisa mengubah skrip ini sehingga saya mendapatkan ftp gdb? Terima kasih


Di bawah ini adalah kode final saya yang berfungsi berdasarkan jawaban @om_hennners yang disediakan.

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
sumber
Kecuali saya mengabaikannya, apakah Anda mengatur ruang kerja lingkungan di mana saja? Bagaimanapun variabel copy_gdb akan menggunakannya sebagai lokasinya.
Hampir
4
Sudahkah Anda mempertimbangkan zip geodatabase Anda menjadi file ZIP? Hampir tidak ada alasan untuk memiliki geodatabase yang tidak terkompresi di situs FTP.
blah238
itu mungkin untuk mengatur geodatabase di situs ftp sebagai ruang kerja tanpa perlu mengunduhnya?
geogeek
3
@geogeek Tidak, ini bukan ...
blah238
1
@PattyJula Harus menulis skrip ftp hari ini. Ternyata ftplib bawaan adalah rasa sakit untuk menavigasi hirarki direktori. Sebagai gantinya saya melakukannya dengan ftputil , yang saya sarankan jika Anda pernah mencoba ini lagi.
om_henners

Jawaban:

9

Dalam hal ini Anda tidak perlu menggunakan perpustakaan arcpy untuk menyalin geodatabase. Alih-alih Anda mencari menyalin file melalui koneksi ftp, yang dapat Anda lakukan dengan retrbinaryperintah ftplib .

Perhatikan juga bahwa sistem file memperlakukan geodatabases sebagai objek folder dengan sekumpulan file di dalamnya. yaitu mereka bukan file biner tunggal yang dapat ditransfer dalam satu hit menggunakan ftplib.

Jadi sebenarnya yang ingin Anda lakukan adalah membuat folder lokal bernama data.gdb, dan kemudian pada server ftp loop melalui semua file hydro.gdbdan unduh. Sesuatu seperti yang berikut ini harus bekerja (dengan sedikit kode yang dipinjam dari stack overflow ini karena saya tidak tahu ftplib dengan baik):

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
sumber
1
Itu berhasil. Terima kasih banyak om_henners! Saya harus mengubah satu atau dua hal kecil dengan kode Anda, saya akan segera mengirim skrip terakhir saya.
Patty Jula