StringIO と cStringIO – ファイルのような API でテキストバッファを扱う

目的:ファイルのような API でテキストバッファを扱う
利用できるバージョン:StringIO: 1.4, cStringIO: 1.5

StringIO はファイルのような API (read, write 等) を使用してメモリ内のテキストを扱う便利な機能を提供します。 StringIO には2つの独立した実装があります。 cStringIO バージョンは速度を考慮して C 言語で実装されています。一方 StringIO は移植性を考慮して Python で実装されています。巨大な文字列を構成するために cStringIO を使用することは、他の文字列連結のテクニックよりも実行速度が速くなります。

サンプル

StringIO バッファの標準的で簡単な使用例は次の通りです。

# このプラットホーム上で利用可能な最も良い実装を探す
try:
    from cStringIO import StringIO
except:
    from StringIO import StringIO

# バッファへ書き込む
output = StringIO()
output.write('This goes into the buffer. ')
print >>output, 'And so does this.'

# 書き込まれた値を取り出す
print output.getvalue()

output.close() # バッファメモリを廃棄する

# 読み込みバッファを初期化する
input = StringIO('Inital value for read buffer')

# バッファから読み込む
print input.read()

この例では read() を使用しますが、 readline()readlines() メソッドも使用することができます。また StringIO クラスは読み込みであるバッファの位置へジャンプできるように seek() メソッドも提供します。 seek() は、ある種の先読み解析アルゴリズムを使用する場合、ファイル位置を巻き戻すために役に立ちます。

$ python stringio_examples.py
This goes into the buffer. And so does this.

Inital value for read buffer

StringIO を使用した実際のアプリケーションは、レスポンスに対してテキストを追加するようなスタックの様々な部分で使用する web アプリケーションスタック、又はあるファイルへの典型的な書き込みを行うプログラムの一部で生成された出力のテストに使用します。

我々がお仕事で開発しているアプリケーションは複数のコマンドラインプログラムからなるシェルスクリプトのインタフェースを含みます。あるシェルスクリプトプログラムでは、データベースからデータを取得して、そのデータをコンソールへ出力する(ユーザへ表示するか、そのテキストを他コマンドへの入力として渡すかのどちらかです)機能を提供します。そのコマンドは様々な方法(XML, bash 構文, 人間が読み易いフォーマット等)でオブジェクトのテキスト出力を生成するためにフォーマッタプラグインセットを共有します。そのフォーマッタは通常は標準出力に書き込むので、StringIO モジュールを使用せずにその出力結果をテストすることはちょっと扱いにくいです。そのフォーマッタの出力結果を途中で取得するために StringIO を使用することは、予想される結果を比較するためにメモリ内にその出力結果を集める簡単な方法になります。

See also

StringIO
本モジュールの標準ライブラリドキュメント
The StringIO module ::: www.effbot.org
StringIO に関する effbot のサンプル
Python における効率的な文字列連結
文字列を連結する様々な方法とその利点の調査
Bookmark and Share