2012-06-26 8 views
19

私はPythonのftplibを使ってそれらを書き込まずにファイルを読み込もうとしています。Pythonを使用してFTPファイルを書き込むことなくFTPファイルを読むことは可能ですか?

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

+0

用語解説:「ダウンロード」は「ディスクに保存」ではなく「サーバーから転送」を意味するため、あなたの質問に対する答えは「いいえ」です。あなたが与えた 'urllib'の例はファイルをダウンロードしません。それはディスクに保存されません。 – senderle

+0

サウンドが好きです。それを開くことなく本を読むことは可能ですか? FTPはファイルを転送するよう設計されています。したがって、ftpプロトコルには、ファイルの読み取り、実行、またはオープンを伴うアクションはありません。 もう1つのstackoverlowトピックで、javaと同じ質問が表示されます。 FTPはファイルをビットストリームとして送信します。したがって、ダウンロード中にファイルを読み込んで処理することは可能です。 http://stackoverflow.com/questions/7690320/how-to-read-files-from-ftp-without-download-them – Erik

+0

ええ、私はそれが私がそれを投稿した後にそれを表現していないことを実感しました...私は編集します今。 – aensm

答えて

35

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

簡単な例である:それは実際に内部変数に読み込むデータを追加するようにあなたが呼び出し可能オブジェクトを使用する、このような何かをwriteFuncを実装する必要があり

#!/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) 

#!/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 StringIO 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

素晴らしいです、ありがとう!私はコールバックがユーザー定義の関数である可能性があることを理解していませんでした – aensm

+1

Python 3の場合、文字列ではなくバイトを返すため、retrbinaryにはBytesIOが必要です。 StringIOが必要な場合は、ftp.retrlines() –