支持字节而非字符串的StringIO替代品?

78 投票
3 回答
53374 浏览
提问于 2025-04-16 20:16

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

这可能不太明显,但如果你之前用StringIO来处理二进制数据,那么在Python 2.7或更新的版本中,你就没办法用了。

3 个回答

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

如果你想要一个支持2.7、2.6以及3.x的统一代码库,你需要多花点功夫。使用six模块会对你有很大帮助。

12

在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'
121

试试 io.BytesIO

正如其他人 提到的,你确实可以在2.7版本中使用 StringIO,但是 BytesIO 是一个更好的选择,因为它在未来的兼容性上表现更好。

撰写回答