用于字节而非字符串的StringIO替代方案?

78

有没有可以替代Python中的StringIO类,能够处理bytes而不是字符串?

可能不太明显,但如果你使用StringIO来处理二进制数据,在Python 2.7或更新版本中将无法使用。


1
你的问题并不明显。请通过展示在2.6中有效但在2.7中无效的代码来演示你所谓的问题。或者查看我的答案。 - John Machin
3个回答

121

试试使用 io.BytesIO

正如 其他人 所指出 的,您确实可以在2.7中使用 StringIO,但是 BytesIO 是前向兼容的好选择。


如何向io.BytesIO对象中写入数据?我收到了TypeError: descriptor 'write' for '_io.BytesIO' objects doesn't apply to a 'bytes' object的错误信息。 - JellicleCat

12
在Python 2.6/2.7中,io模块旨在与Python 3.X兼容。根据文档:
“从版本2.6开始。
io模块提供了Python流处理的接口。在Python 2.x下,io模块被建议作为内置文件对象的替代品,但在Python 3.x中,它是访问文件和流的默认接口。”
请注意,由于此模块主要是为Python 3.x设计的,因此您必须了解本文档中所有“字节(bytes)”的用法都指的是str类型(其中bytes是别名),而所有“文本(text)”的用法都指的是unicode类型。此外,在io API中这两种类型不能互换。
在早于3.X版本的Python中,StringIO模块包含StringIO的旧版,与io.StringIO不同,它可以在Python 2.6以前的版本中使用:
>>> 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'

8
你说:“如果你在处理二进制数据时使用StringIO,那么在Python 2.7或更新版本上将无法使用”。
这并不明显,因为它是不正确的。 如果你的代码在2.6或更早版本上工作,它仍然可以在2.7上运行。未经编辑的屏幕截图(Windows命令提示符窗口在第80列换行):
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上运行的代码,请使用io模块中的BytesIO类。如果您需要/想要支持2.7、2.6等版本以及3.x的单一代码库,那么您需要付出更多的努力。使用six模块应该会有很大帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接