我想从一个ftp站点向另一个ftp站点发送带有python ftplib的文件,以避免文件读/写过程.
我创建了一个BytesIO流:
myfile=BytesIO()
Run Code Online (Sandbox Code Playgroud)
我使用retrbinary成功从ftp站点检索图像文件:
ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)
Run Code Online (Sandbox Code Playgroud)
我可以将此内存对象保存为常规文件:
fot=open('casab.jpg', 'wb')
fot=myfile.readvalue()
Run Code Online (Sandbox Code Playgroud)
但我无法通过ftp与storbinary发送此流.我认为这会奏效:
ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())
Run Code Online (Sandbox Code Playgroud)
但不是.我得到一个很长的错误消息msg结尾'buf = fp.read(blocksize)AttributeError:'str'对象没有属性'read'
我也试过很多荒谬的组合,但没有成功.顺便说一句,我对myfoto.write真正做的事情也很困惑.不应该是myfoto.write()吗?
我对这个缓冲器的功能或要求也很无能为力.我想要的实现太复杂了吗?我应该在系统中使用中间写/读来ping文件吗?所有
编辑:感谢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()
Run Code Online (Sandbox Code Playgroud)