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()
可以按预期工作,并且结果存档中的文件与原始文件之间没有区别。
如果我们知道这种方法行不通的特殊情况,那么我会很感兴趣的听到它:)