print で標準出力以外に出力する

この記事は Python Tips Advent Calendar 2012 5日目の記事です。


※以下の説明は Python 2 用です。Python 3 では print(..., file=sys.stderr) などになります。


print 関数はデフォルトでは標準出力に出力しますが、明示的に指定すればそれ以外の場所、標準エラーなどにも出力できます。

>>> import sys
>>> print>>sys.stderr, 10,20 # 標準出力に '10 20\n' が出力される

これはファイルオブジェクトのようなインターフェースさえ持ってるものなら何でもいいので、当然ファイルにも出力できます。

>>> with open('hoge', 'w') as f:
...     print>>f, 10,20 # 'hoge' ファイルに '10 20\n' が出力される


また、StringIO を使うと、print の出力を文字列として受け取る事ができます。

>>> import StringIO
>>> fd = StringIO.StringIO()
>>> print>>fd, 10,20
>>> fd.getvalue()
'10 20\n'

これは例えば、出力する文字列に対するテストなどに使えます。

>>> import sys
>>> def print_rot13(data, fd = sys.stdout):
...     print>>fd, data.encode('rot13')
>>> 
>>> import StringIO
>>> fd = StringIO.StringIO()
>>> print_rot13('Hello', fd)
>>> assert fd.getvalue() == 'Uryyb\n'


.