Python2.7中的StringIO和io.StringIO有什么区别?

San*_*nta 29 python string

除了明显的(一个是类型,另一个类)?什么应该是首选?用例中的任何显着差异,也许?

S.L*_*ott 30

http://docs.python.org/library/io.html#io.StringIO

http://docs.python.org/library/stringio.html

我明白了

用于unicode文本的内存中流.它继承了TextIOWrapper.

该模块实现了一个类文件类StringIO,它读写字符串缓冲区(也称为内存文件).

io.StringIO是一个班级.它处理Unicode.它反映了首选的Python 3库结构.

StringIO.StringIO是一个班级.它处理字符串.它反映了传统的Python 2库结构.

什么应该是首选?

始终向新的图书馆组织迈进.本io.open应该用来代替内置的Unicode的不知道open.

向前.向前走.

  • 实际上,如果您的其他2.7软件包/模块还不能识别unicode,那么前进到io.StringIO行为可能会导致问题.当gunicorn"向前移动"并且Django没有[这里](https://github.com/benoitc/gunicorn/pull/728/files)和[here](https://code.djangoproject)时,至少它为我做了.COM /票/ 20185). (5认同)
  • @hobs 我在尝试使用 io.StringIO 到 mock.patch `argparse` 时遇到了同样的问题。我发现让测试在 2 和 3 中运行的最好方法是`try: from StringIO import StringIO except ImportError: from io import StringIO`。 (2认同)

Pod*_*Pod 5

关于python 2.7和3:

io.BytesIO是类似于文件的内存中对象,它不会对换行符做任何更改,并且类似于open(filename, "wb")。它处理bytes()字符串,在py2.7中是的别名str

io.StringIO是类似于文件的内存中对象,确实对换行符进行了更改,与相似open(filename, "w")。它处理unicode()字符串,在py3.x中是的别名str

py2.7的old StringIO.StringIO是一个类似于文件的内存对象,它不会更改换行符,与相似open(filename, "w")。它以大多数过时的python 2字符串方法处理这两种方法,unicode()并且bytes()以相同的方式处理:通过允许您混合它们而不会出错,但前提是您幸运。

因此,py2.7的旧StringIO.StringIO类实际上比io.StringIO更类似于io.BytesIO,因为它以bytes()/ str()的形式运行,并且不进行换行转换。

应该首选什么?

根据用例StringIO.StringIO,不要使用,而是使用io.BytesIOio.StringIO。这与python 3向前兼容,并提交字节或unicode,而不是“两者都”。