不使用Python编写FTP文件就可以读取吗?

2024-04-29 06:49:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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文件吗?


Tags: 文件pathurlreadgetreturndefpage
1条回答
网友
1楼 · 发布于 2024-04-29 06:49:14

好吧,答案就在眼前: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的评论:

相关问题 更多 >