75

文字列の代わりに動作するPythonStringIOクラスの代替品はありますか?bytes

明らかではないかもしれませんが、バイナリデータの処理にStringIOを使用した場合、Python2.7以降では運が悪いことになります。

4

3 に答える 3

117

試してみてくださいio.BytesIO

他の 指摘しているようStringIOに、2.7で実際に使用できますがBytesIO、上位互換性のための良い選択です。

于 2011-06-25T16:42:39.063 に答える
12

Python 2.6 / 2.7では、ioモジュールはPython3.Xとの互換性のために使用されることを目的としています。ドキュメントから:

バージョン2.6の新機能。

ioモジュールは、ストリーム処理のためのPythonインターフェースを提供します。Python 2.xでは、これは組み込みのファイルオブジェクトの代替として提案されていますが、Python 3.xでは、ファイルとストリームにアクセスするためのデフォルトのインターフェイスです。

注このモジュールは主にPython3.x用に設計されているため、このドキュメントでの「バイト」のすべての使用はstrタイプ(バイトはエイリアス)を指し、「テキスト」のすべての使用は「テキスト」を指すことに注意する必要があります。ユニコードタイプを参照してください。さらに、これら2つのタイプはioAPIでは互換性がありません。

3.Xより前のバージョンのPythonでは、StringIOio.StringIOモジュールにレガシーバージョンの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'
于 2011-06-25T19:25:18.500 に答える
8

「明らかではないかもしれませんが、バイナリデータの処理にStringIOを使用した場合、Python2.7以降では運が悪い」とあなたは言います。

それは真実ではないので、それは明らかではありません。

2.6以前で動作するコードがある場合は、2.7でも動作し続けます。編集されていない画面ダンプ(80列目以降のWindowsコマンドプロンプトウィンドウの折り返し):

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をサポートする単一のコードベースが必要/必要な場合は、もう少し努力する必要があります。6つのモジュールを使用すると、非常に役立ちます。

于 2011-06-25T22:59:51.230 に答える