因此,将BytesIO对象写入文件的快速方法是使用:
with open('myfile.ext', 'wb') as f:
f.write(myBytesIOObj.getvalue())
myBytesIOObj.close()
但是,如果我想迭代myBytesIOObj而不是将其写入一个块,我该怎么做呢?我是Python 2.7.1。另外,如果BytesIO很大,那么迭代编写是否会更有效?
由于
答案 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)