Python中的二进制缓冲区

时间:2008-08-24 15:37:51

标签: python binary io buffer

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

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

3 个答案:

答案 0 :(得分:78)

您可能正在寻找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")

答案 1 :(得分:24)

只要您不尝试将任何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()

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

如果你知道这种方法不起作用的特定情况,我最感兴趣的是听到它:)

答案 2 :(得分: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)

在这个例子中,“>”告诉读取big-endian“h”读取2字节短路,“l”读取4字节长。您显然可以将这些更改为您需要读取的二进制数据...