支持字节而非字符串的StringIO替代品?
有没有可以替代Python中StringIO
类的东西,能够处理bytes
而不是字符串呢?
这可能不太明显,但如果你之前用StringIO
来处理二进制数据,那么在Python 2.7或更新的版本中,你就没办法用了。
3 个回答
你说:“这可能不明显,但如果你用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上运行的代码,使用BytesIO
类,它在io
模块里。
如果你想要一个支持2.7、2.6以及3.x的统一代码库,你需要多花点功夫。使用six模块会对你有很大帮助。
在Python 2.6和2.7中,io模块是为了和Python 3.X兼容而设计的。从文档中可以看到:
这个功能在2.6版本中新增。
io模块提供了Python处理流的接口。在Python 2.x中,这个模块被提议作为内置文件对象的替代方案,但在Python 3.x中,它是访问文件和流的默认接口。
需要注意的是,由于这个模块主要是为Python 3.x设计的,所以文档中提到的所有“bytes”都指的是str类型(bytes是它的别名),而所有“text”则指的是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'
试试 io.BytesIO
。
正如其他人 提到的,你确实可以在2.7版本中使用 StringIO
,但是 BytesIO
是一个更好的选择,因为它在未来的兼容性上表现更好。