2011-01-14 3 views
9

मैंने रीम्स सर्वर से कनेक्ट करने के लिए एक पायथन स्क्रिप्ट बनाई है।ftp.retrbinary() मदद पाइथन

datfile = [] 
for dk in range(len(files)): 
dfnt=files[dk] 
dpst=dfnt.find('.dat') 
if dpst == 15: 
dlist = dfnt[:] 
datfile.append(dlist) 

assert datfile == ['a.dat','b.dat'] 
# True 

जो आप एक सूची बना सकते हैं। अब मैं

ftp.retrbinary('datfile') 

के लिए इस सूची से गुजर रहा है, लेकिन इस लाइनों एक त्रुटि देता है:

typeerror: retrbinary() takes at least 3 arguments (2 given) 

नहीं यकीन है कि क्या तलाश कर रहा है?

+3

कृपया अपने प्रश्न को ऐसे तरीके से दोबारा सुधारें जो पाइथन कोड के इंडेंटेशन को संरक्षित करता है और कोड से टेक्स्ट का समग्र पृथक्करण करता है। – ulidtko

उत्तर

22

यह आपको बता रहा है कि आप retrbinary विधि पर पर्याप्त तर्क प्रदान नहीं कर रहे हैं।

documentation specifies कि आपको एक 'कॉलबैक' फ़ंक्शन भी प्रदान करना होगा जो प्राप्त डेटा के प्रत्येक ब्लॉक के लिए बुलाया जाता है। आप एक कॉलबैक फ़ंक्शन लिखना चाहते हैं और यह आपको डेटा के साथ कुछ करना चाहते हैं (उदाहरण के लिए इसे फ़ाइल में लिखें, इसे मेमोरी में इकट्ठा करें, आदि)

एक साइड नोट के रूप में, आप पूछ सकते हैं कि यह क्यों कहता है केवल '2' के बजाय '3' आवश्यक तर्क हैं। ऐसा इसलिए है क्योंकि यह 'स्वयं' तर्क को भी गिन रहा है कि पायथन को उदाहरण विधियों पर आवश्यकता है, लेकिन आप ftp ऑब्जेक्ट संदर्भ के साथ पूरी तरह से गुजर रहे हैं।

EDIT - ऐसा लगता है कि मैंने आपके प्रश्न का पूरी तरह उत्तर नहीं दिया हो सकता है।

command तर्क के लिए आप एक वैध आरईटीआर कमांड पास करने वाले हैं, सूची में नहीं।

filenames = ['a.dat', 'b.dat'] 

# Iterate through all the filenames and retrieve them one at a time 
for filename in filenames: 
    ftp.retrbinary('RETR %s' % filename, callback) 

callback के लिए, आप कुछ है कि प्रतिदेय है (आम तौर पर किसी प्रकार के एक समारोह) है कि एक ही तर्क को स्वीकार करता है पारित करने के लिए की जरूरत है। तर्क पुनर्प्राप्त किए जा रहे फ़ाइल से डेटा का एक हिस्सा है। मैं एक 'खंड' कहता हूं क्योंकि जब आप बड़ी फ़ाइलों को चारों ओर ले जा रहे हैं, तो आप शायद ही कभी पूरी फाइल को स्मृति में रखना चाहते हैं। लाइब्रेरी को आपके कॉलबैक को तत्काल रूप से आमंत्रित करने के लिए डिज़ाइन किया गया है क्योंकि यह डेटा के हिस्सों को प्राप्त करता है। यह आपको फ़ाइल के हिस्सों को लिखने की अनुमति देता है ताकि आपको किसी भी समय स्मृति में अपेक्षाकृत कम मात्रा में डेटा रखना होगा।

मेरे यहाँ उदाहरण थोड़ा उन्नत है, लेकिन अपने कॉलबैक के अंदर एक बंद हो सकता है पाश के लिए है कि एक फ़ाइल जो खोल दिया गया है करने के लिए लिखते हैं:

import os 

filenames = ['a.dat', 'b.dat'] 

# Iterate through all the filenames and retrieve them one at a time 
for filename in filenames: 
    local_filename = os.path.join('/tmp', filename) 

    # Open a local file for writing (binary mode)... 
    # The 'with' statement ensures that the file will be closed 
    with open(local_filename, 'wb') as f: 
     # Define the callback as a closure so it can access the opened 
     # file in local scope 
     def callback(data): 
      f.write(data) 

     ftp.retrbinary('RETR %s' % filename, callback) 

यह भी एक lambda के साथ और अधिक संक्षेप में किया जा सकता है बयान, लेकिन मुझे पाइथन के लिए नए लोग मिलते हैं और इसकी कुछ कार्यात्मक-शैली अवधारणाएं पहले उदाहरण को अधिक आसानी से समझती हैं।

ftp.retrbinary('RETR %s' % filename, lambda data: f.write(data)) 

मैं तुम्हें भी ऐसा कर सकता है लगता है, फ़ाइल का write उदाहरण विधि सीधे गुजर अपने कॉलबैक के रूप में:

ftp.retrbinary('RETR %s' % filename, f.write) 

इन सभी के तीन फिर भी, यहां के बजाय एक लैम्ब्डा के साथ एफ़टीपी कॉल है उदाहरण समान होना चाहिए और उम्मीद है कि उनके माध्यम से पता लगाना आपको यह समझने में मदद करेगा कि क्या हो रहा है।

उदाहरण के लिए मैंने किसी प्रकार की त्रुटि प्रबंधन को दूर किया है।

इसके अलावा, मैंने उपरोक्त किसी भी कोड का परीक्षण नहीं किया है, इसलिए यदि यह काम नहीं करता है तो मुझे बताएं और मैं देखूंगा कि मैं इसे स्पष्ट कर सकता हूं या नहीं।

+0

धन्यवाद, मुझे समझ में नहीं आया कि मुझे कॉलबैक फ़ंक्शन प्रदान करना था, क्या आप मुझे कुछ अच्छे दस्तावेज़ों में इंगित करने में सक्षम होंगे, मैं कुछ जानकारी देखने की कोशिश कर रहा हूं लेकिन अभी भी थोड़ा उलझन में हूं। जहां तक ​​मैं सूची को पार करने की कोशिश कर रहा हूं, क्या यह स्वीकार्य है? –

+1

@ fabio.geraci - मैंने आपके उत्तर का विस्तार किया है कि आपको 'retrbinary' और' callback' कैसे काम करता है। मुझे पाइथन दस्तावेज़ों की तुलना में किसी भी बेहतर दस्तावेज के बारे में पता नहीं है, लेकिन मैं मानता हूं कि दस्तावेज मानता है कि आपके पास पाइथन के कुछ कामकाजी ज्ञान हैं। यदि यह आपके प्रश्नों का उत्तर देता है, तो भविष्य के यात्रियों के लिए इसे स्वीकार करना सुनिश्चित करें। –

+0

आपको बहुत धन्यवाद –

संबंधित मुद्दे