将BytesIO对象快速写入文件的方法是使用:
with open('myfile.ext', 'wb') as f:
f.write(myBytesIOObj.getvalue())
myBytesIOObj.close()
不过,如果我想迭代myBytesIOObj而不是一次性写入,我该怎么做?我使用的是Python 2.7.1。另外,如果BytesIO很大,通过迭代写入是否更有效率呢?
谢谢。
shutil
有一个工具可以高效地写文件。它默认以16K字节的块进行复制。任何4K字节的倍数都应该是跨平台的好选择,我选择131072只是因为文件在写入磁盘之前会被写入操作系统缓存,并且块大小并不是非常重要。
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)