用字节而不是字符串工作的StringIO替换?


68

是否有替代pythonStringIO类的替代品,可以bytes代替字符串使用?

可能并不明显,但是如果您使用StringIO处理二进制数据,那么您在使用Python 2.7或更高版本时就不走运了。


1
您的问题不明显。请通过显示在2.6中有效但在2.7中无效的代码来证明您所声称的问题。或者看我的答案。
约翰·马钦

Answers:


111

尝试io.BytesIO

正如其他 指出的那样,您确实可以StringIO在2.7中使用它,但是BytesIO对于前向兼容性而言,它是一个不错的选择。


11

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

2.6版的新功能。

io模块提供Python接口来进行流处理。在Python 2.x下,建议使用它作为内置文件对象的替代方法,但是在Python 3.x中,它是访问文件和流的默认接口。

注意:由于此模块主要是为Python 3.x设计的,因此必须注意,本文档中对“字节”的所有使用均指str类型(其字节为别名)以及对“文本”的所有使用。指的是unicode类型。此外,这两种类型在io API中不可互换。

在3.X之前的Python版本中,StringIO模块包含旧版本的StringIO,与旧版io.StringIO2.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'

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.