代码之家  ›  专栏  ›  技术社区  ›  jelovirt

Python中的二进制缓冲区

  •  55
  • jelovirt  · 技术社区  · 16 年前

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

    我的用例是我想在内存中创建一个ZIP文件 ZipFile

    3 回复  |  直到 10 年前
        1
  •  87
  •   akhan    13 年前

    您可能正在寻找 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
  •  24
  •   twasbrillig    10 年前

    StringIO 你要小心不要使用 cStringIO 你应该没事的。

    根据 StringIO 文档,只要您保持unicode或8位,一切都能正常工作。大概 斯特林吉奥 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
  •  4
  •   twasbrillig    10 年前

    查看struct包: 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字节。显然,您可以将这些更改为从二进制数据中读取所需的任何内容。。。