Ftp sitesindeki dosya coğrafi veritabanını Python kullanarak yerel diske mi kopyalıyorsunuz?


11

Python betiği ile indirmek istediğim bir ftp sitesinde oturan bir dosya geodatabase var. Şu anda bunu yapmanın bir yolu ftp geodatabase bilgisayarımdaki bir geodatabase kopyalamak olduğunu düşünüyorum. Başladığım senaryo aşağıda. Herkes ftp gdb elde böylece bu komut dosyasını nasıl değiştirebilir biliyor mu? teşekkür ederim


Aşağıda verilen @om_hennners cevabına dayanan son çalışma kodum var.

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"

Göz ardı etmediğim sürece, ortam çalışma alanını herhangi bir yere mi ayarlıyorsunuz? Her iki şekilde de copy_gdb değişkeni onu konum olarak kullanır.
AH

4
Coğrafi veritabanınızı bir ZIP dosyasına sıkıştırmayı düşündünüz mü? Bir FTP sitesinde sıkıştırılmamış bir coğrafi veritabanına sahip olmanız için neredeyse hiçbir neden yoktur.
blah238

ftp sitesinde bir coğrafi veritabanını indirmenize gerek kalmadan çalışma alanı olarak ayarlamak mümkün mü?
geogeek

3
@geogeek Hayır, değil ...
blah238

1
@PattyJula Bugün bir ftp betiği yazmak zorunda kaldım. Dahili ftplib'in bir dizin heirarchy gezinmek için bir acı olduğu ortaya çıkıyor. Bunun yerine bunu hiç denemek için tavsiye ederim ftputil ile yaptım .
om_henners

Yanıtlar:


9

Bu durumda, coğrafi veritabanını kopyalamak için arcpy kitaplıklarını kullanmanız gerekmez. Bunun yerine, ftplib retrbinarykomutuyla yapabileceğiniz bir ftp bağlantısı üzerinden dosya kopyalamaya bakıyorsunuz .

Ayrıca dosya sisteminin coğrafi veritabanlarını, içinde bir dizi dosya bulunan klasör nesneleri olarak ele aldığını unutmayın. yani ftplib kullanılarak tek bir isabetle aktarılabilen tek bir ikili dosya değildir.

Yani gerçekten yapmak istediğiniz şey, denilen yerel bir klasör oluşturmak data.gdbve daha sonra ftp sunucusunda tüm dosyaları dolaşır hydro.gdbve indirir. Aşağıdaki gibi bir şey ( ftplib çok iyi bilmiyorum gibi bu yığın taşma cevap ödünç biraz kod ile) çalışması gerekir :

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
İşe yaradı. Çok teşekkür ederim om_henners! Kodunuzla birlikte bir veya iki küçük şeyi değiştirmek zorunda kaldım, yakında son senaryomu göndereceğim.
Patty Jula
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.