यह आपको बता रहा है कि आप 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)
इन सभी के तीन फिर भी, यहां के बजाय एक लैम्ब्डा के साथ एफ़टीपी कॉल है उदाहरण समान होना चाहिए और उम्मीद है कि उनके माध्यम से पता लगाना आपको यह समझने में मदद करेगा कि क्या हो रहा है।
उदाहरण के लिए मैंने किसी प्रकार की त्रुटि प्रबंधन को दूर किया है।
इसके अलावा, मैंने उपरोक्त किसी भी कोड का परीक्षण नहीं किया है, इसलिए यदि यह काम नहीं करता है तो मुझे बताएं और मैं देखूंगा कि मैं इसे स्पष्ट कर सकता हूं या नहीं।
कृपया अपने प्रश्न को ऐसे तरीके से दोबारा सुधारें जो पाइथन कोड के इंडेंटेशन को संरक्षित करता है और कोड से टेक्स्ट का समग्र पृथक्करण करता है। – ulidtko