11

ファイルの読み取り/書き込みプロセスを回避するために、ある ftp サイトから別の ftp サイトに python ftplib を使用してファイルを送信したい。

BytesIO ストリームを作成します。

myfile=BytesIO()

そして、retrbinary を使用して ftp サイト 1 からイメージ ファイルを取得することに成功しました。

ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)

このメモリ オブジェクトを通常のファイルに保存できます。

fot=open('casab.jpg', 'wb')

fot=myfile.readvalue()

しかし、storbinary を使用して ftp 経由でこのストリームを送信することはできません。私はこれがうまくいくと思った:

ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())

しかし、そうではありません。'buf = fp.read(blocksize) AttributeError: 'str' object has no attribute 'read' で終わる長いエラー メッセージが表示されます

私も多くのばかげた組み合わせを試しましたが、成功しませんでした。余談ですが、myfoto.write で実際に何をしているのかについてもかなり困惑しています。それは myfoto.write() であるべきではありませんか?

また、このバッファが何をするか、または必要とするかについてもまったくわかりません。私がやりたいことは複雑すぎて達成できませんか? システムで中間の書き込み/読み取りを使用してファイルをピンポンする必要がありますか? すべてのタイ

編集: abanert のおかげで、私は物事をまっすぐにしました。記録として、storbinary 引数が間違っていたため、ストリームを送信する前に「巻き戻す」ために myfile.seek(0) が必要でした。これは、中間の物理ファイルへの書き込みなしで、2 つの ftp アドレス間でファイルを移動する実用的なスニペットです。

import ftplib as ftp
from io import BytesIO

ftp_one=ftp.FTP(address1, user1, pass1)
ftp_two=ftp.FTP(address2, user2, pass2)
myfile=BytesIO()
ftp_one.retrbinary ('RETR imageoldname.jpg', myfile.write)
myfile.seek(0)
ftp_two.storbinary('STOR imagenewname.jpg', myfile)
ftp_one.close()
ftp_two.close()
myfile.close()
4

1 に答える 1