34

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ファイルを読み取ることは可能ですか?

4

1 に答える 1

62

答えはすぐ目の前にあります。このFTP.retrbinaryメソッドは、FTP 接続からファイル コンテンツを取得するたびに呼び出される関数への参照を 2 番目のパラメーターとして受け取ります。

簡単な例を次に示します。

#!/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 標準ライブラリに、このようなことを目的としたモジュールがあることに気付きましたBytesIO

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

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

print r.getvalue()
于 2012-06-26T14:17:35.377 に答える