【问题标题】:Writing a BytesIO object to a file, 'efficiently'将 BytesIO 对象写入文件,“高效”
【发布时间】:2016-08-20 03:13:48
【问题描述】:

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

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

但是,如果我想遍历 myBytesIOObj 而不是将它写成一个块,我该怎么做呢?我在 Python 2.7.1 上。另外,如果 BytesIO 很大的话,会不会是一种更高效的迭代写法?

谢谢

【问题讨论】:

    标签: python io bytesio


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 太棒了。非常感谢。这完美地工作。是的,我不会费心关闭我的文件指针。但是,我的 Bytes/String IO 指针,我想关闭,实际上,丢弃它并让它进入垃圾收集器。
      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多