Python中的二进制缓冲区

时间:2020-03-05 18:42:35  来源:igfitidea点击:

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

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

解决方案

回答

查看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字节短,而" l"读取4字节长。我们显然可以将它们更改为从二进制数据中读取所需的任何内容...

回答

只要我们不尝试将任何unicode数据放入StringIO中,并且小心不要使用cStringIO,就可以了。

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

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

如果我们知道这种方法行不通的特殊情况,那么我会很感兴趣的听到它:)