web-dev-qa-db-ja.com

文字列ではなくバイトで動作するStringIO置換?

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

明らかではないかもしれませんが、バイナリデータの処理にStringIOを使用した場合、Python 2.7以降で不運です。

60
sorin

io.BytesIO

othershave が指摘したように、2.7ではStringIOを実際に使用できますが、BytesIOは前方互換性に適した選択肢です。

103
senderle

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

バージョン2.6の新機能。

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

注このモジュールは主にPython 3.x向けに設計されているため、このドキュメントでの「バイト」の使用はすべてstrタイプ(そのバイトはエイリアスです)を指すことに注意してください)、および「テキスト」のすべての使用はUnicodeタイプを指しますさらに、これらの2つのタイプはio APIでは交換できません。

Python 3.Xより前のバージョン) StringIO モジュールには、io.StringIOは、Pythonの2.6より前のバージョンで使用できます。

>>> 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'
10
Mark Tolonen

あなたは言います:(それは明らかではないかもしれませんが、バイナリデータの処理に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 モジュールは大いに役立つはずです。

7
John Machin