aen*_*nsm 28 python ftp ftplib
我试图使用Python的ftplib读取文件而不编写它们.大致相当于:
def get_page(url):
try:
return urllib.urlopen(url).read()
except:
return ""
Run Code Online (Sandbox Code Playgroud)
但使用FTP.
我试过了:
def get_page(path):
try:
ftp = FTP('ftp.site.com', 'anonymous', 'passwd')
return ftp.retrbinary('RETR '+path, open('page').read())
except:
return ''
Run Code Online (Sandbox Code Playgroud)
但这不起作用.文档中的唯一示例涉及使用该ftp.retrbinary('RETR README', open('README', 'wb').write)格式编写文件.是否可以在不先写入的情况下读取ftp文件?
dan*_*ann 49
好吧,你的答案就在你的面前: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)
Run Code Online (Sandbox Code Playgroud)
您应该实现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
Run Code Online (Sandbox Code Playgroud)
更新:我意识到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()
Run Code Online (Sandbox Code Playgroud)
更新2: StringIO已经归入io.合并@TimRichardson的评论:
| 归档时间: |
|
| 查看次数: |
22774 次 |
| 最近记录: |