यह सिर्फ एक समस्या को हल करना चाहते हैं, तो मैं wget
आदेश का सुझाव दे सकता:
cd c:\destination
wget --mirror --continue --no-host-directories --user=username --password=s3cr3t ftp://hostname/source/path/
--continue
विकल्प बहुत खतरनाक हो सकता है अगर फ़ाइलों सर्वर पर परिवर्तन। अगर फाइलें केवल जोड़े गए हैं, तो यह बहुत दोस्ताना है।
हालांकि, अगर यह आपके लिए एक सीखने व्यायाम है और आप अपने कार्यक्रम काम करना चाहते हैं, मुझे लगता है कि आप इस लाइन को देखकर शुरू कर देना चाहिए:
for subdir, dirs, files in os.walk(directory):
directory
कर दिया गया है आपके अधिकांश कार्यक्रम में रिमोट स्रोत निर्देशिका, लेकिन os.walk()
फ़ंक्शन दूरस्थ निर्देशिका पर नहीं चल सकता है। retrlines
फ़ंक्शन पर दिए गए कॉलबैक का उपयोग करके, आपको लौटाई गई फाइलों पर स्वयं को पुन: सक्रिय करने की आवश्यकता है।
MLSD
या NLST
विकल्प LIST
के बजाय NLST
विकल्पों पर नज़र डालें, तो शायद उन्हें पार्स करना आसान होगा। (ध्यान दें कि एफ़टीपी वास्तव में निर्दिष्ट नहीं करता है कि सूचियों को कैसे दिखाना चाहिए; यह हमेशा एक इंसान द्वारा कंसोल पर संचालित किया जाना था, या एक विशिष्ट फ़ाइल नाम स्थानांतरित किया जाना था। ऐसे प्रोग्राम जो एफ़टीपी लिस्टिंग के साथ चालाक चीजें करते हैं जैसे उन्हें उपयोगकर्ता में प्रस्तुत करना एक जीयूआई में शायद अजीब या अस्पष्ट सर्वर के लिए विशेष केस कोड की विशाल ढेर होनी चाहिए। और दुर्भावनापूर्ण फ़ाइल नामों का सामना करते समय वे शायद कुछ बेवकूफ़ बनाते हैं।)
क्या आप इसके बजाय sftp
का उपयोग कर सकते हैं? sftp
में फ़ाइल लिस्टिंग को पार्स किए जाने के लिए एक विनिर्देश है, स्पष्ट रूप से उपयोगकर्ता नाम/पासवर्ड संचारित नहीं करता है, और पासिव बनाम सक्रिय कनेक्शन की विशाल परेशानी नहीं है - यह केवल एकल कनेक्शन का उपयोग करता है, जिसका अर्थ है कि यह एफ़टीपी की तुलना में अधिक फ़ायरवॉल में काम करता है।
संपादित करें: आपको retrlines
फ़ंक्शन पर 'कॉल करने योग्य' ऑब्जेक्ट पास करने की आवश्यकता है। एक कॉल करने योग्य ऑब्जेक्ट या तो उस वर्ग का उदाहरण है जो __call__
विधि या फ़ंक्शन को परिभाषित करता है। जबकि समारोह का वर्णन करना आसान हो सकता है, एक वर्ग का एक उदाहरण अधिक उपयोगी हो सकता है। (आप फ़ाइल नाम एकत्र करने के लिए उदाहरण का उपयोग कर सकते हैं, लेकिन फ़ंक्शन को वैश्विक चर पर लिखना होगा। खराब।)
यहाँ सबसे सरल प्रतिदेय वस्तु में से एक है:
>>> class c:
... def __call__(self, *args):
... print(args)
...
>>> f = c()
>>> f('hello')
('hello',)
>>> f('hello', 'world')
('hello', 'world')
यह एक नया वर्ग, c
, कि एक उदाहरण विधि __call__
को परिभाषित करता है बनाता है। यह सिर्फ अपने तर्कों को काफी बेवकूफ तरीके से प्रिंट करता है, लेकिन यह दिखाता है कि हम कितनी कम बात कर रहे हैं। :)
आप कुछ होशियार चाहता था, तो यह कुछ इस तरह कर सकता है:
class handle_lines:
def __init__(self):
self.lines = []
def __call__(self, *args):
self.lines << args[0]
इस वर्ग की एक वस्तु के साथ कॉल iterlines
, तो वस्तु की जानकारी के लिए lines
सदस्य में लग रहे हो।
@ सोस्टी, मेरे पोस्ट में उल्लेख किया गया 'रेट्रलाइन' फ़ंक्शन प्रलेखन के लिए एक हाइपरलिंक है :) – sarnold
इसके लिए बहुत कुछ धन्यवाद, वे सभी ठोस सुझावों की तरह लगते हैं! मैं विंडोज एक्सपी पर पायथन 2.5 का उपयोग कर आईएम का उल्लेख करना भूल गया (अगर यह बिल्कुल उपयोगी है) यदि मैं एमएलएसडी विकल्प, 'ftp.retrlines (' एमएलएसडी ')' का उपयोग करता हूं, तो कोड पुनरावृत्ति के लिए काम करेगा या क्या मुझे संशोधित करने की आवश्यकता है अधिक? (यकीन है कि यह थोड़ा सा दफ़्तर लगता है लेकिन यहां नया है, याद रखें?: डीडी) – Sosti
@ सोस्टी, आपको अभी भी अपना कोड संशोधित करने की आवश्यकता होगी: आप 'os.walk()' फ़ंक्शन का उपयोग नहीं कर सकते। 'Retrlines' के लिए कॉलबैक ऑब्जेक्ट को कैसे बनाना है, यह दिखाने के लिए मैं थोड़ा सा जवाब दूंगा। – sarnold