将 BytesIO 对象写入文件,'efficiently'
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 中的 OS 缓存,并且块大小没什么大不了的。
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)
因此,将 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 中的 OS 缓存,并且块大小没什么大不了的。
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)