gpt4 book ai didi

python - ftp 发送 python bytesio 流

转载 作者:IT王子 更新时间:2023-10-28 23:37:45 24 4
gpt4 key购买 nike

我想用 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) 在发送之前“倒回”流。这是一个在两个 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()

最佳答案

问题在于您正在调用 getvalue()。只是不要这样做:

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

storbinary需要一个可以调用 read 的类文件对象。

幸运的是,你有这样一个对象,myfile,一个 BytesIO . (从您的代码中并不完全清楚这里的事情顺序 - 如果这不能按原样工作,您可能需要 myfile.seek(0) 或以不同的模式创建它什么的。但是 BytesIO 将与 storbinary 一起工作,除非你做错了什么。)

但不是传递 myfile,而是传递 myfile.getvalue()。和getvalue "返回包含缓冲区全部内容的 bytes。"

所以,不是给 storbinary 一个可以调用 read 的类文件对象,而是给它一个 bytes 对象,当然和 Python 2.x 中的 str 一样,不能在上面调用 read


在你身边:

As an aside, I am also quite puzzled with what I am really doing with myfoto.write. Shouldnt it be myfoto.write() ?

the docs .第二个参数不是文件,是回调函数。

The callback function is called for each block of data received, with a single string argument giving the data block.

您想要的是一个将每个数据 block 附加到 myfoto 末尾的函数。虽然您可以编写自己的函数来做到这一点:

def callback(block_of_data):
myfoto.write(block_of_data)

... 很明显,这个函数与 myfoto.write 方法的作用完全相同。因此,您可以只传递该方法本身。

如果您不了解绑定(bind)方法,请参阅 Method Objects在教程中。


这种灵 active ,虽然看起来很奇怪,但让您做的事情甚至比将整个文件下载到缓冲区以发送到另一台服务器更好。实际上,您可以同时打开两个连接,并使用回调将每个缓冲区从源服务器发送到目标服务器,而无需存储超过一个缓冲区。

但是,除非您真的需要,否则您可能不想经历所有这些复杂性。

事实上,一般来说,ftplib 是一种低级的。它有一些设计(例如 storbinary 获取文件,而 retrbinary 获取回调)在低级别完全有意义,但从更高级别看起来很奇怪等级。因此,您可能希望通过执行 search at PyPI 来查看一些更高级别的库。 .

关于python - ftp 发送 python bytesio 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com