在Python中,您可以使用StringIO作为字符数据的文件类缓冲区。 Memory-mapped file基本上对二进制数据做类似的事情,但它需要一个用作基础的文件。 Python是否有一个用于二进制数据的文件对象,并且只是内存,相当于Java的ByteArrayOutputStream?Python中的二进制缓冲区
我使用的用例是我想在内存中创建一个ZIP文件,而ZipFile需要一个类似文件的对象。
在Python中,您可以使用StringIO作为字符数据的文件类缓冲区。 Memory-mapped file基本上对二进制数据做类似的事情,但它需要一个用作基础的文件。 Python是否有一个用于二进制数据的文件对象,并且只是内存,相当于Java的ByteArrayOutputStream?Python中的二进制缓冲区
我使用的用例是我想在内存中创建一个ZIP文件,而ZipFile需要一个类似文件的对象。
您可能正在寻找io.BytesIO类。它的工作原理完全一样,除了StringIO的,它支持二进制数据:
from io import BytesIO
bio = BytesIO(b"some initial binary data: \x00\x01")
StringIO的将抛出类型错误:
from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
看看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)
INT该示例中,“>”告诉阅读大端的“h”的读出2字节的短,并且“L”为4字节长。你可以明显地改变这些任何你需要读出的二进制数据...
只要你不尝试把任何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()
工程只是符合预期,并有在生成的存档文件和原始文件之间没有什么区别。
如果你知道一个特定的情况下,其中这种方法是不行的,我最感兴趣听到它:)
为什么cStringIO在这里不起作用? – 2011-05-10 20:59:36
它应该在大多数情况下工作。我记不起3年前我的想法,但其中一个原因是write()方法的输入在两个版本之间略有不同(取决于输入类型),我不想依赖内部行为在zipfile中。 – 2011-05-11 20:46:21
你的意思是让这样的事情:http://stackoverflow.com/questions/4239666/getting-bytes-from-unicode-string-in-python – yucer 2016-12-27 11:18:59