- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想用 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/
我在 Python 中从 BytesIO 对象编写 .tar.gz 文件时遇到问题。只编写一个普通的 tarfile 效果很好,但是如果我将写入模式更改为 .tar.gz(或 bz 或 xz),它不会
我使用PyPDF4来合并pdf文件,然后使用合并后的pdf作为HttpResponse。我使用 BytesIO 来获取 PdfFileMerger 的结果。 我使用这段代码让它工作 def merge
当我尝试使用 python "c:\Django\blongo\blongo\blog\manage.py" runserver 我得到: File "C:\Python27\lib\site-pac
我无法理解这两个 BytesIO 对象的区别。如果我这样做: f = open('decoder/logs/testfile.txt', 'rb') file = io.BytesIO(f.read(
我正在尝试在我的程序中使用 Pillow 将相机中的字节串保存到文件中。这是一个示例,其中包含来 self 的相机的一个小原始字节字符串,它应该表示分辨率为 10x5 像素的灰度图像,使用 LSB 和
我有以下代码: 这部分在内存中生成 CSV: def to_csv(events: list) -> io.BytesIO(): if not events: return N
IOBase.truncate 的文档方法说: truncate(size=None) Resize the stream to the given size in bytes (or the cur
尝试在 python3.0 中对字符串进行标记化时,为什么在标记开始之前会出现前导 'utf-8'? 来自python3 docs , tokenize 现在应该按如下方式使用: g = tokeni
我正在开发 Scrapy Spider,尝试使用 slate 从目录中的多个 PDF 文件中提取文本。我对将实际的 PDF 保存到磁盘没有兴趣,因此建议我查看 io.bytesIO 子类 https:
在 OSX 上的 Python 3.5.1 上运行: import io b = io.BytesIO() b.write(b'222') print(b.getvalue()) b.truncate
我想试试 python BytesIO 类。 作为一个实验,我尝试写入内存中的 zip 文件,然后从该 zip 文件中读取字节。因此,我没有将文件对象传递给 gzip,而是传递了一个 BytesIO
我有一个包含 excel 文档数据的 BytesIO 对象。我要使用的库不支持 BytesIO 并且需要一个 File 对象。如何获取我的 BytesIO 对象并将其转换为 File 对象? 最佳答案
我目前正在尝试创建一个用于深度学习的大型数据集,其中包含大量存储在一起的压缩 mp3 文件,因此我没有 10 万个文件必须单独加载。 x = b'' with open("file1.mp3", "r
我想使用 io 中的 BytesIO 类来创建数据流,但是如果我通过它传输大量数据,它会占用大量内存,所以我问是否可以释放“旧”使用的内存“我已经阅读过的数据。 如果 io 模块无法做到这一点,我愿意
查看底部的更新 - 问题略有变化 我正在尝试使用 boto3 的 .download_fileobj 方法将文件从 s3 下载到类似文件的对象,但是当我尝试检查下载的字节流时,它是空的。但是我不确定我
我正在尝试使用 discord.py 发送一个文本文件,但是当我发送该文件时,它似乎是空的。 一个示例片段: bytes = BytesIO() test = b'sadfasdfsa' bytes.
我正在用 python 2.7 制作一个项目,但由于文档是用 python 3.5 编写的,所以它开始在最后部分给我带来一些错误。所以我将所有内容更改为 python 3.5,但由于 bytesIO,
我想直接在模型保存中上传生成的图像,而不必先将其保存到文件中。 型号: avatar = models.ImageField(upload_to="img/", null=True, blank=Tr
有一段不错的、经过测试的 python PyPDF2 代码,一个 .py 设计用于在“真实”操作系统文件上运行。调试完所有内容后,我现在正尝试将其合并到 plPython 函数中,用 io.Bytes
我想将 BytesIO 对象用作连续缓冲区(常见用例)。但是,是否可以从头部删除不再需要的字节? 看起来不像,因为只有一个 truncate() 方法。 ['__class__', '__delatt
我是一名优秀的程序员,十分优秀!