题
在Python中,您可以使用 StringIO 获取字符数据的文件缓冲区。 内存映射文件基本上对二进制数据执行类似操作,但它需要一个文件用作基础。 Python是否有一个用于二进制数据的文件对象,并且只是内存,相当于Java的 ByteArrayOutputStream ?
我的用例是我想在内存中创建一个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位一切都按预期工作。据推测, 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()
按预期工作,生成的存档中的文件与原始文件没有区别。
如果你知道这种方法不起作用的特定情况,我最感兴趣的是听到它:)
查看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字节短路,并且“1”读取“1”。是一个4字节长。您显然可以将这些更改为您需要从二进制数据中读取的任何内容...
不隶属于 StackOverflow