将BytesIO对象写入文件,“有效地”#39;

时间:2016-08-20 03:13:49

标签: python io bytesio

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

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

但是,如果我想迭代myBytesIOObj而不是将其写入一个块,我该怎么做呢?我是Python 2.7.1。另外,如果BytesIO很大,那么迭代编写是否会更有效?

由于

2 个答案:

答案 0 :(得分:10)

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块退出时自动关闭。

答案 1 :(得分:3)

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