2008-08-24 110 views

回答

69

您可能正在寻找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") 
3

看看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字节长。你可以明显地改变这些任何你需要读出的二进制数据...

+0

你的意思是让这样的事情:http://stackoverflow.com/questions/4239666/getting-bytes-from-unicode-string-in-python – yucer 2016-12-27 11:18:59

24

只要你不尝试把任何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() 

工程只是符合预期,并有在生成的存档文件和原始文件之间没有什么区别。

如果你知道一个特定的情况下,其中这种方法是不行的,我最感兴趣听到它:)

+0

为什么cStringIO在这里不起作用? – 2011-05-10 20:59:36

+0

它应该在大多数情况下工作。我记不起3年前我的想法,但其中一个原因是write()方法的输入在两个版本之间略有不同(取决于输入类型),我不想依赖内部行为在zipfile中。 – 2011-05-11 20:46:21