【发布时间】:2013-06-07 19:42:19
【问题描述】:
我想用 python ftplib 将文件从一个 ftp 站点发送到另一个站点,以避免文件读/写进程。
我创建了一个 BytesIO 流:
myfile=BytesIO()
并且我使用 retrbinary 从 ftp 站点一成功检索了图像文件:
ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)
我可以将此内存对象保存到常规文件中:
fot=open('casab.jpg', 'wb')
fot=myfile.readvalue()
但我无法通过 ftp 与 storbinary 发送此流。我认为这会起作用:
ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())
但没有。我收到一个以 'buf = fp.read(blocksize) 结尾的长错误消息 AttributeError: 'str' 对象没有属性 'read'
我也尝试了许多荒谬的组合,但都没有成功。顺便说一句,我对 myfoto.write 的真正用途也很困惑。不应该是 myfoto.write() 吗?
我也对这个缓冲区的作用或要求一无所知。我想要实现的目标太复杂了吗?我应该只在系统中使用中间写入/读取来 ping pong 文件吗?都来了
编辑:感谢 abanert,我把事情搞清楚了。作为记录,storbinary 参数是错误的,并且需要一个 myfile.seek(0) 在发送之前“倒回”流。这是一个有效的 sn-p,可以在两个 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()
【问题讨论】:
-
旁注:“我可以将此内存对象保存到常规文件中”实际上根本没有保存信息。
fot=open('casab.jpg', 'wb')创建一个新的空文件,然后fot=myfile.readvalue()忘记了文件对象,将其替换为字符串。你需要像fot.write(myfile.readvalue())这样的东西来实际写入文件。 (您可能需要也可能不需要先myfile.seek(0)。) -
非常感谢您提示 BytesIO 流需要使用 seek(0)“倒带”!这解决了我上传成功但文件为空的问题 \o/
标签: python file memory ftplib bytesio