我想不用写他们阅读使用Python的FTPLIB文件。 事情大致相当于:
def get_page(url):
try:
return urllib.urlopen(url).read()
except:
return ""
但使用FTP。
我试过了:
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)
格式。 是否有可能读取FTP文件,而无需先写?
那么,你必须在你的面前正确的答案:该retrbinary方法接受作为第二个参数到每当文件内容是从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
更新:我意识到有Python标准库中的模块,是为这样的事情,StringIO的:
#!/usr/bin/env python
from ftplib import FTP
from io 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:StringIO的已经被整合进IO。 成立@ TimRichardson的评论: