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

24

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

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

不过,如果我想迭代myBytesIOObj而不是一次性写入,我该怎么做?我使用的是Python 2.7.1。另外,如果BytesIO很大,通过迭代写入是否更有效率呢?

谢谢。

2个回答

28

shutil有一个工具可以高效地写文件。它默认以16K字节的块进行复制。任何4K字节的倍数都应该是跨平台的好选择,我选择131072只是因为文件在写入磁盘之前会被写入操作系统缓存,并且块大小并不是非常重要。

import shutil

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

顺便说一下,在结束时不需要关闭文件对象。with定义了一个作用域,文件对象在该作用域内定义。因此,文件句柄在退出with块时自动关闭。


太棒了。非常感谢。这个完美运行。是的,我不会麻烦地关闭我的文件指针。不过,对于我的Bytes/String IO指针,我想要关闭它,实际上是将其丢弃并交给垃圾收集器处理。 - Kalabaaz

11

自从 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接