68

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

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

4

3 回答 3

88

您可能正在寻找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")
于 2011-09-09T06:34:34.550 回答
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()

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

如果您知道这种方法不起作用的特定情况,我最有兴趣了解它:)

于 2008-08-24T16:52:29.453 回答
4

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

于 2008-08-24T15:50:54.077 回答