2011-06-25 40 views
49

是否有python StringIO类的替代品,其中一个可以与bytes而不是字符串一起使用?Python的StringIO替换与字节而不是字符串?

这可能并不明显,但如果您使用StringIO来处理二进制数据,那么对于Python 2.7或更新版本而言,您并不幸运。

+1

你的问题并不明显。请通过显示在2.6但不在2.7下工作的代码来证明您的指称问题。或者看我的答案。 –

+0

作者还没有选择正确答案! – heltonbiker

回答

78

尝试io.BytesIO

由于othershave指出的那样,你的确可以使用2.7 StringIO,但BytesIO是向前兼容一个不错的选择。

+0

它在那里:http://docs.python.org/release/2.7.2/library/io.html#io.BytesIO – matchew

+0

是的,它适用于Python 3.3 –

7

在Python 2.6/2.7中,io模块旨在用于与Python 3.X兼容。从文档:

版本2.6中的新功能。

io模块为流处理提供了Python 接口。在 Python 2.x中,这是 替代内置文件 的对象,但在Python 3.x中,它是 默认接口,用于访问文件流和 流。

注该模块已经 主要设计为Python 3.x中,你 必须要知道,本文件中的 “字节”的所有用途指 STR型(其中字节是别名) , 和“文本”的所有用法是指 unicode类型。此外,这两个 类型在IOo API中不可互换。

在Python版本早于3.X的StringIO模块包含StringIO的,遗留下来的版本,它不像io.StringIO可以预先2.6版本的Python的使用:

>>> import StringIO 
>>> s=StringIO.StringIO() 
>>> s.write('hello') 
>>> s.getvalue() 
'hello' 
>>> import io 
>>> s=io.StringIO() 
>>> s.write('hello') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string argument expected, got 'str' 
>>> s.write(u'hello') 
5L 
>>> s.getvalue() 
u'hello' 
6

你说:“这可能并不明显,但是如果你使用StringIO来处理二进制数据,那么对于Python 2.7或更新的版本而言,运气不佳。“

这并不明显,因为它不是真的。

如果您的代码适用于2.6或更低版本,则它将继续工作在2.7。未经编辑的屏幕转储(在山坳80 Windows命令提示符窗口包裹和所有):

C:\Users\John>\python26\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr 
ite('hello\n');print repr(s.getvalue()), sys.version" 
'hello\n' 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] 

C:\Users\John>\python27\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr 
ite('hello\n');print repr(s.getvalue()), sys.version" 
'hello\n' 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] 

如果你需要写上2.7和3.x运行的代码,使用BytesIOio模块中。

如果您需要/想要一个支持2.7,2.6,...和3.x的代码库,您需要努力工作。使用six模块应该有很大的帮助。