2012-06-26 17 views
19

मैं उन्हें लिख बिना पायथन के ftplib का उपयोग करके फ़ाइलें पढ़ने के लिए कोशिश कर रहा हूँ। कुछ लगभग बराबर:क्या पाइथन का उपयोग करके उन्हें लिखने के बिना एफ़टीपी फाइलें पढ़ना संभव है?

def get_page(url): 
    try: 
     return urllib.urlopen(url).read() 
    except: 
     return "" 

लेकिन एफ़टीपी का उपयोग करना।

मैंने कोशिश की:

def get_page(path): 
    try: 
     ftp = FTP('ftp.site.com', 'anonymous', 'passwd') 
     return ftp.retrbinary('RETR '+path, open('page').read()) 
    except: 
     return '' 

लेकिन यह काम नहीं करता। दस्तावेज़ों में एकमात्र उदाहरण ftp.retrbinary('RETR README', open('README', 'wb').write) प्रारूप का उपयोग कर फाइलें लिखना शामिल हैं। क्या पहले लिखने के बिना एफटीपी फाइलें पढ़ना संभव है?

+0

एक पारिभाषिक वक्रोक्ति: आपके सवाल का जवाब के रूप में आप phrased है यह कोई है, क्योंकि "डाउनलोड" का अर्थ है "सर्वर से स्थानांतरण", नहीं "डिस्क को बचाने के लिए।" 'Urllib' उदाहरण आपने _does_ फ़ाइल डाउनलोड की है; यह सिर्फ डिस्क पर सहेजता नहीं है। – senderle

+0

जैसा लगता है। क्या इसे खोलने के बिना एक किताब पढ़ना संभव है? एफ़टीपी बस फ़ाइलों को हस्तांतरण करने के लिए बनाया गया है। तो ftp प्रोटोकॉल में कोई क्रिया नहीं है जिसमें फ़ाइल को पढ़ने, चलाने या खोलने शामिल हैं। एक और stackoverlow विषय जावा के लिए एक ही सवाल बन गया है। एफ़टीपी फ़ाइल को थोड़ा स्ट्रीम के रूप में भेजता है। इसलिए डाउनलोड के दौरान फ़ाइल को पढ़ना और संभालना संभव हो सकता है। http://stackoverflow.com/questions/7690320/how-to-read-files-from-ftp-without-download-them – Erik

+0

हाँ, मुझे एहसास हुआ कि मैं phrased कि खराब होने के बाद मैं इसे पोस्ट ... मैं संपादित करेंगे अभी व। – aensm

उत्तर

35

ठीक है, आपके पास सही जवाब है: रेट्रैबिनरी विधि दूसरे पैरामीटर के रूप में स्वीकार करता है जिसे किसी फ़ंक्शन के संदर्भ में स्वीकार किया जाता है जिसे फ़ाइल सामग्री को FTP कनेक्शन से पुनर्प्राप्त किया जाता है।

यहाँ एक सरल उदाहरण है:

#!/usr/bin/env python 
from ftplib import FTP 

def writeFunc(s): 
    print "Read: " + s 

ftp = FTP('ftp.kernel.org') 
ftp.login() 
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', writeFunc) 

आप writeFunc को लागू करना चाहिए ताकि यह वास्तव में डेटा एक आंतरिक चर, कुछ इस तरह है, जो एक प्रतिदेय वस्तु का उपयोग करता है करने के लिए पढ़ने के लिए संलग्न कर देता है:

#!/usr/bin/env python 
from ftplib import FTP 

class Reader: 
    def __init__(self): 
    self.data = "" 
    def __call__(self,s): 
    self.data += s 

ftp = FTP('ftp.kernel.org') 
ftp.login() 
r = Reader() 
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r) 

print r.data 

अपडेट: मुझे एहसास हुआ कि पाइथन मानक लाइब्रेरी में एक मॉड्यूल है जो इस तरह की चीजों के लिए है, स्ट्रिंगियो:

#!/usr/bin/env python 
from ftplib import FTP 
from StringIO import StringIO 

ftp = FTP('ftp.kernel.org') 
ftp.login() 
r = StringIO() 
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r.write) 

print r.getvalue() 
+2

बहुत बढ़िया, धन्यवाद! मैं कॉलबैक एक उपयोगकर्ता परिभाषित किया जा सकता है समारोह – aensm

+1

अजगर 3 के लिए नहीं पता था, retrbinary BytesIO क्योंकि यह बाइट्स, नहीं स्ट्रिंग रिटर्न की आवश्यकता है,। यदि आप स्ट्रिंगियो चाहते हैं, तो ftp.retrlines() का प्रयास करें –

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