StringIO替换使用字节而不是字符串?

时间:2011-06-25 16:40:18

标签: python unicode python-2.7 stringio

是否有替代python StringIO类,可以使用bytes代替字符串吗?

这可能不是很明显,但如果您使用StringIO处理二进制数据,那么您将无法使用Python 2.7或更新版本。

3 个答案:

答案 0 :(得分:101)

尝试io.BytesIO

正如others have指出的那样,您确实可以在2.7中使用StringIO,但BytesIO是前向兼容性的不错选择。

答案 1 :(得分:10)

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

  

2.6版中的新功能。

     

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

     

注意由于此模块已经存在   主要是为Python 3.x而设计的   必须要知道所有的用途   本文档中的“字节”是指   str类型(其中bytes是别名),   并且“文本”的所有用法都指的是   unicode类型。而且,那两个   类型不可互换   io API。

在早于3.X的Python版本中,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'

答案 2 :(得分:7)

你说:“它可能并不明显,但是如果你使用StringIO来处理二进制数据,那么你就不幸使用Python 2.7或更新的”。

这并不明显,因为事实并非如此。

如果您的代码适用于2.6或更早版本,则会继续使用2.7 。未编辑的屏幕转储(Windows命令提示符窗口包装在col 80和all):

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上运行的代码,请使用BytesIO模块中的io类。

如果您需要/想要一个支持2.7,2.6,...和3.x的单一代码库,您将需要更加努力。使用six模块应该帮助很多。