1

関連しているように見える投稿されたかなりの数の質問を調べましたが、私が抱えている問題と完全に同じではありません。

Pythonのftplibモジュールをzipfileとともに使用して、ftpからzipファイルをバイナリ形式でダウンロードしています。ただし、何らかの理由で、ダウンロードした zip ファイルが ASCII 形式になっているように見えます。

ダウンロードするファイルのパスに先頭/が存在しないことを確認しました (zip 仕様と一致させるため)。

outFile = zipfile.ZipFile(local_file_path, 'w')
myftp.retrbinary('RETR %s' %i, outFile.write(i))  #i - target file path on ftp server

このコードは失敗し、次のエラーが表示されます。

st = os.stat(filename)
OSError: [Errno 2] No such file or directory: //$i

バイナリに 'b' オプションを追加しようとしましたが、zipfile が気に入らないようです:

outFile = zipfile.ZipFile(local_file_path, 'wb')

これによりエラーが発生します。

RuntimeError: ZipFile() requires mode "r", "w", or "a"

私はpython v2.6を使用しています。

何が間違っていて、どうすれば修正できますか?

4

1 に答える 1

0

python doc ( http://docs.python.org/2/library/ftplib.html )によるとretrbinary、2 番目のパラメーターとしてコールバックを受け取るようです。

>>> ftp.retrbinary('RETR README', open('README', 'wb').write)
'226 Transfer complete.'
>>> ftp.quit()

ドキュメントには次のように記載されています。

FTP.retrbinary(コマンド、コールバック[、最大ブロックサイズ[、残り]])

バイナリ転送モードでファイルを取得します。command は、適切な RETR コマンドである必要があります: 'RETR filename'。データ ブロックを指定する 1 つの文字列引数を使用して、受信したデータ ブロックごとにコールバック関数が 呼び出されます。[...]

あなたの例では、outfile.write(の代わりにoutfile.write(i))でなければなりません。

>>> ftp.retrbinary('RETR %s' % i, outFile.write)
于 2013-11-13T23:52:47.790 に答える