Screaming Loud

日々是精進

fileinputの罠

標準入力を読み込んで操作をする時にモジュールのfileinputを使うのは常套手段なはず.
一応参考までに使い方を.

#print.py
import fileinput

for line in fileinput.input():
    print line

このコードで標準入力をそのまま標準出力する.

このようにfileinputを利用する時は,大抵パイプを利用する場合である

%cat hoge.txt
グーグル
ヤフー
アマゾン

%cat hoge.txt | python print.py
グーグル
ヤフー
アマゾン

しかし,forループなどを使いたくなることもある.
例えば,以下のような場合である.

#loop.py
import fileinput

for i in range(3):
    for line in fileinput.input():
        print line

これを実行したとき

%cat hoge.txt | python loop.py
グーグル
ヤフー
アマゾン

となってしまう.

これはfileinput.input()は一回しか読み込まれないのである.
これはしっかり注意しておくべき!

参考URL5.17 fileinput --
複数の入力ストリームをまたいだ行の繰り返し処理をサポートする。