文字列の代わりに動作するPythonStringIO
クラスの代替品はありますか?bytes
明らかではないかもしれませんが、バイナリデータの処理にStringIOを使用した場合、Python2.7以降では運が悪いことになります。
文字列の代わりに動作するPythonStringIO
クラスの代替品はありますか?bytes
明らかではないかもしれませんが、バイナリデータの処理にStringIOを使用した場合、Python2.7以降では運が悪いことになります。
試してみてくださいio.BytesIO
。
他の人 が指摘しているようStringIO
に、2.7で実際に使用できますがBytesIO
、上位互換性のための良い選択です。
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'
「明らかではないかもしれませんが、バイナリデータの処理に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つのモジュールを使用すると、非常に役立ちます。