是否有可能读取FTP文件,而无需使用Python写呢?(Is it possible to read

2019-06-25 19:07发布

我想不用写他们阅读使用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文件,而无需先写?

Answer 1:

那么,你必须在你的面前正确的答案:该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的评论:



文章来源: Is it possible to read FTP files without writing them using Python?