ライブラリ: StringIO

Pythonの「StringIO」というライブラリについてご紹介します。

import StringIO

StringIOは、文字列にファイルオブジェクトのインタフェースを与えることができるライブラリです。StringIOを使うと、文字列をファイルオブジェクトのように扱うことができます。

例を見てみましょう。

01 文字列の追加

import StringIO

io = StringIO.StringIO()

io.write('This is the first line.\n')
io.write('This is second.\n')

io.close()

StringIOライブラリを使うには、まずはStringIOインスタンスを生成します。生成したインスタンスのwrite()メソッドに文字列を渡すと、文字列を追加することができます。

これはちょうど、次のようにFileクラスのインスタンスに対してwrite()メソッドを使うことと同じようなイメージになります。

f = open('sample.txt', 'r')

f.write('This is the first line.\n')
f.write('This is second.\n')

f.close()

close()でそのインスタンスを解放できる点もFileオブジェクトと同じです。

f.writelines(['3rd\n', '4th\n', '5th\n'])

write()では引数に文字列を受け取りましたが、writelines()の場合は文字列のリストやタプルを受け取ります。

print >> io, '6th\n'

StringIOインスタンスをprint文の出力先に設定することもできます。

02 文字列の読み出し

sentence = u"""古池や
蛙飛びこむ
水の音
"""

io2 = StringIO.StringIO(sentence)
print io2.getvalue()
io2.close()
# 次のとおり表示
# 古池や
# 蛙飛びこむ
# 水の音

文字列の読み出しには、いくつかのメソッドを使うことができます。getvalue()は、バッファ内の文字列をすべて返してくれるメソッドです。

ほかの読み出し用メソッドとしては、次のようなものがあります。

  • read()
  • readline()
  • readlines()

このあたりのメソッドはFileオブジェクトにあるものと同じ働きをします。それぞれ次のような特徴があります。

  • read() 現在のポインタ(カーソル?)の位置以降の文字列をすべて返す
  • readline() 現在のポインタの位置以降の行を1行返す
  • readlines() 現在のポインタの位置以降の文字列を行ごとに分けてリストで返す

いずれも引数として整数値を渡すとそのバイト分だけの文字列を返す仕様となっていますが、それぞれちょっとずつちがいがあります。詳細は公式ドキュメントのFileオブジェクトのパートをご確認いただくのがよいかと思います。

上で出てきたgetvalue()とこれらとのちがいは、これら3つは現在のポインタの位置によって出力が異なりますが、getvalue()はポインタの位置にかかわらずすべての文字列を返してくる点です。

以上です。

StringIOをたくさん使う場合には、StringIOと同じインタフェースを備えたより高速なcStringIOを使うのがよさそうです。

参考