我想用 python ftplib 发送一个文件,从一个 ftp 站点到另一个,以避免文件读/写进程。
我创建了一个 BytesIO 流:
myfile=BytesIO()
我使用 retrbinary 从 ftp 站点一成功检索了图像文件:
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() 吗?
我对这个缓冲区的作用或需要什么也一无所知。我想要实现的目标太复杂了吗?我应该只在系统中使用中间写入/读取来 ping pong 文件吗?全部
编辑:感谢 abanert,我把事情搞清楚了。作为记录, storbinary 参数是错误的,并且需要一个 myfile.seek(0) 在发送之前“倒回”流。这是一个工作片段,可在两个 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()