Python中的二进制缓冲区
Posted
技术标签:
【中文标题】Python中的二进制缓冲区【英文标题】:Binary buffer in Python 【发布时间】:2010-09-06 17:01:39 【问题描述】:在 Python 中,您可以使用 StringIO 作为字符数据的类似文件的缓冲区。 Memory-mapped file 基本上对二进制数据做了类似的事情,但它需要一个文件作为基础。 Python 是否有一个用于二进制数据且仅为内存的文件对象,相当于 Java 的 ByteArrayOutputStream?
我的用例是我想在内存中创建一个 ZIP 文件,而ZipFile 需要一个类似文件的对象。
【问题讨论】:
【参考方案1】:您可能正在寻找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")
【讨论】:
【参考方案2】:只要您不尝试将任何 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()
按预期工作,生成的存档中的文件与原始文件没有区别。
如果您知道这种方法不起作用的特定情况,我很想知道它:)
【讨论】:
它应该在大多数情况下工作。我不记得我 3 年前的想法了,但一个原因是 write() 方法的输入在两个版本之间工作方式略有不同(取决于输入类型),我不想依赖内部zipfile 中的行为。【参考方案3】:查看结构包: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 字节长。您显然可以将这些更改为您需要从二进制数据中读取的任何内容...
【讨论】:
你的意思是做这样的事情:***.com/questions/4239666/…以上是关于Python中的二进制缓冲区的主要内容,如果未能解决你的问题,请参考以下文章