Python中的二进制缓冲区

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

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

jelovirt asked 2019-11-08T09:48:16Z
3个解决方案
80 votes

您可能正在寻找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")
akhan answered 2019-11-08T09:48:39Z
24 votes

只要您不尝试将任何unicode数据放入您的StringIO,并且要小心不要使用f.write(u"asdf"),就可以了。

根据StringIO文档,只要您使用unicode或8位,一切都会按预期进行。 据推测,当有人执行f.write(u"asdf")(据我所知ZipFile不执行)时,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()

可以按预期工作,并且结果存档中的文件与原始文件之间没有区别。

如果您知道在这种情况下这种方法行不通的特殊情况,那么,我将非常有兴趣了解:)

Henrik Gustafsson answered 2019-11-08T09:49:23Z
3 votes

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

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


在此示例中,“>”告诉读取大字节序,“ h”读取2字节短,而“ l”读取4字节长。 您显然可以将它们更改为从二进制数据中读取所需的任何内容...

mmattax answered 2019-11-08T09:50:01Z
translate from https://stackoverflow.com:/questions/25116/binary-buffer-in-python