繁体   English   中英

将 BytesIO 对象“有效地”写入文件

[英]Writing a BytesIO object to a file, 'efficiently'

因此,将 BytesIO 对象写入文件的快速方法是使用:

with open('myfile.ext', 'wb') as f:
    f.write(myBytesIOObj.getvalue())
myBytesIOObj.close()

但是,如果我想遍历 myBytesIOObj 而不是将其写成一个块,我将如何处理? 我在 Python 2.7.1 上。 另外,如果 BytesIO 很大,它会是一种更有效的迭代写入方式吗?

谢谢

shutil有一个实用程序可以有效地写入文件。 它以块的形式复制,默认为 16K。 任何 4K 块的倍数都应该是一个很好的跨平台数。 我相当随意地选择了 131072,因为实际上文件在进入磁盘之前已写入 RAM 中的操作系统缓存,并且块大小并不是什么大问题。

import shutil

myBytesIOObj.seek(0)
with open('myfile.ext', 'wb') as f:
    shutil.copyfileobj(myBytesIOObj, f, length=131072)

顺便说一句,最后不需要关闭文件对象。 with定义了一个范围,并且文件对象在该范围内定义。 因此文件句柄在退出with块时自动关闭。

从 Python 3.2 开始,可以使用BytesIO.getbuffer()方法,如下所示:

from io import BytesIO
buf = BytesIO(b'test')
with open('path/to/file', 'wb') as f:
    f.write(buf.getbuffer())

这样它就不会复制缓冲区的内容,而是直接将其流式传输到打开的文件中。

注意: StringIO缓冲区不支持getbuffer()协议(从 Python 3.9 开始)。

在将BytesIO缓冲区流式传输到文件之前,您可能希望将其位置设置为开头:

buf.seek(0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM