पायथन का उपयोग करके स्थानीय डिस्क पर ftp साइट पर फ़ाइल जियोडेटबेस की नकल करना?


11

एक फ़ाइल जियोडैटेबेस एक फीट साइट पर बैठा है जिसे मैं पायथन स्क्रिप्ट के साथ डाउनलोड करना चाहूंगा। अभी मैं ऐसा करने का एक तरीका सोच रहा हूं कि यह है कि अपने कंप्यूटर पर एक जियोडेटाबेस के लिए ftp जियोडेटाबेस कॉपी करें। नीचे वह स्क्रिप्ट है जो मैंने शुरू की है। क्या किसी को पता है कि मैं इस स्क्रिप्ट को कैसे बदल सकता हूं ताकि मैं ftp gdb प्राप्त करूं? धन्यवाद


नीचे मेरा अंतिम, काम करने वाला कोड है जो उत्तर दिए गए @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"

जब तक मैंने इसे नजरअंदाज नहीं किया, क्या आप कहीं भी पर्यावरण कार्यक्षेत्र स्थापित कर रहे हैं? किसी भी तरह से copy_gdb वैरिएबल को उसके स्थान के रूप में उपयोग करने जा रहा है।
23

4
क्या आपने अपने जियोडैटबेस को ज़िप फ़ाइल में रखने पर विचार किया है? किसी एफ़टीपी साइट पर एक असम्पीडित जियोडेटाबेस होने का लगभग कोई कारण नहीं है।
blah238

इसे डाउनलोड करने की आवश्यकता के बिना कार्यक्षेत्र के रूप में ftp साइट पर एक जियोडैटबेस सेट करना संभव है?
geogeek

3
@geogeek नहीं, यह नहीं है ...
blah238

1
@PattyJula को आज एक ftp स्क्रिप्ट लिखनी थी। इनबिल्ट फ़ुटबॉल की बारी एक निर्देशिका उत्तराधिकार को नेविगेट करने के लिए एक दर्द है। इसके बजाय मैंने इसे फ़ुटपुटिल के साथ किया था , जिसे मैं सुझाऊँगा कि अगर आप कभी भी इसे फिर से आज़माएँ।
om_henners

जवाबों:


9

इस मामले में आपको जियोडेटाबेस को कॉपी करने के लिए चापलूस पुस्तकालयों का उपयोग करने की आवश्यकता नहीं है। इसके बजाय आप एक ftp कनेक्शन पर फ़ाइलों की प्रतिलिपि देख रहे हैं, जो आप ftplib retrbinaryकमांड के साथ कर सकते हैं ।

यह भी ध्यान दें कि फ़ाइल सिस्टम जियोडैट डेटाबेस को उनके अंदर फ़ाइलों के एक सेट के साथ फ़ोल्डर ऑब्जेक्ट के रूप में मानता है। यानी वे एक भी बाइनरी फ़ाइल नहीं हैं जो ftplib का उपयोग करके एक हिट में स्थानांतरित किया जा सकता है।

तो वास्तव में आप क्या करना चाहते हैं नामक एक स्थानीय फ़ोल्डर बना सकते हैं data.gdb, और फिर सभी फ़ाइलों के माध्यम से hydro.gdbऔर उन्हें डाउनलोड करने के माध्यम से FTP सर्वर छोरों पर । निम्नलिखित की तरह कुछ काम करना चाहिए ( इस ढेर अतिप्रवाह उत्तर से उधार लिया गया कोड के रूप में, क्योंकि मुझे 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
वह काम किया। बहुत बहुत धन्यवाद om_henners! मुझे आपके कोड के साथ एक या दो छोटी चीजों को बदलना था, मैं जल्द ही अपनी अंतिम स्क्रिप्ट पोस्ट करूंगा।
पैटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.