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中的二进制缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

Python 可写缓冲区/内存视图到数组/字节数组/ctypes 字符串缓冲区

C_Python不释放缓冲存储器

如何将二进制缓冲区解码为 node.js 中的图像?

Python:文件操作

将音频缓冲区从 Python 脚本传输到 Go 服务器?

C 语言文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )