Python中的二进制缓冲区

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

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

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

只要你不尝试把任何Unicode数据放入你的StringIO ,你注意不要使用cStringIO你应该没问题。

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

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

正如预期的那样工作,并且结果存档文件和原始文件之间没有区别。

如果你知道一个特定的情况下,这种方法不起作用,我会很有兴趣听到它:)

看看struct包: https : //docs.python.org/library/struct.html ,它允许你将string解释为打包的二进制数据。

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

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

在这个例子中,“>”表示读取big-endian,“h”读取一个2字节的短,而“l”表示一个4字节的长度。 你可以明显地改变这些无论你需要读出的二进制数据…