【问题标题】:Binary buffer in PythonPython中的二进制缓冲区
【发布时间】:2010-09-06 17:01:39
【问题描述】:

在 Python 中,您可以使用 StringIO 作为字符数据的类似文件的缓冲区。 Memory-mapped file 基本上对二进制数据做了类似的事情,但它需要一个文件作为基础。 Python 是否有一个用于二进制数据且仅为内存的文件对象,相当于 Java 的 ByteArrayOutputStream

我的用例是我想在内存中创建一个 ZIP 文件,而ZipFile 需要一个类似文件的对象。

【问题讨论】:

    标签: python binary io buffer


    【解决方案1】:

    您可能正在寻找io.BytesIO 类。它的工作原理与 StringIO 完全一样,只是它支持二进制数据:

    from io import BytesIO
    bio = BytesIO(b"some initial binary data: \x00\x01")
    

    StringIO 会抛出 TypeError:

    from io import StringIO
    sio = StringIO(b"some initial binary data: \x00\x01")
    

    【讨论】:

      【解决方案2】:

      只要您不尝试将任何 unicode 数据放入您的 StringIO 并且小心不要使用 cStringIO 就可以了。

      根据StringIO 文档,只要您保持 unicode 或 8 位,一切都会按预期工作。据推测,StringIO 在某人执行f.write(u"asdf") 时会做一些特别的事情(据我所知,ZipFile 不会这样做)。无论如何;

      import zipfile
      import StringIO
      
      s = StringIO.StringIO()
      z = zipfile.ZipFile(s, "w")
      z.write("test.txt")
      z.close()
      f = file("x.zip", "w")
      f.write(s.getvalue())
      s.close()
      f.close()
      

      按预期工作,生成的存档中的文件与原始文件没有区别。

      如果您知道这种方法不起作用的特定情况,我很想知道它:)

      【讨论】:

      • 它应该在大多数情况下工作。我不记得我 3 年前的想法了,但一个原因是 write() 方法的输入在两个版本之间工作方式略有不同(取决于输入类型),我不想依赖内部zipfile 中的行为。
      【解决方案3】:

      查看结构包:https://docs.python.org/library/struct.html,它允许您将字符串解释为打包的二进制数据。

      不确定这是否会完全回答您的问题,但您可以使用 struct.unpack() 将二进制数据转换为 python 对象。

      import struct f = open(filename, "rb") s = f.read(8) x, y = struct.unpack(">hl", s)

      在这个例子中,“>”告诉读取大端,“h”读取 2 字节短,“l”读取 4 字节长。您显然可以将这些更改为您需要从二进制数据中读取的任何内容...

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-23
      • 2014-09-01
      • 2013-03-05
      • 2020-05-10
      • 2021-07-24
      • 2019-06-04
      • 1970-01-01
      • 2015-12-10
      相关资源
      最近更新 更多