Python Tips: 標準入力を 1 行ずつ処理したい

Python で標準入力から入力を得て 1 行ずつ処理する方法をご紹介します。

ちょっとしたコマンドラインツールを作るときに 1 行ずつ処理できれば便利かと思います。

やり方はいくつか考えられるかと思いますが、ひとつカンタンな方法は fileinput ライブラリを使う方法です。

# ライブラリを読み込み
import fileinput

# 入力の各行に対して処理を行う
for line in fileinput.input():
# some process...
pass

たとえば、単語の数を行ごとに数えてみたいなら次のようにすれば OK です。

# word_count.py
import fileinput

for line in fileinput.input():
    print(len(line.split()))

次の内容のファイル sample.txt があったとすると

Freude, schöner Götterfunken
Tochter aus Elysium,
Wir betreten feuertrunken,
Himmlische, dein Heiligtum!
Deine Zauber binden wieder
Was die Mode streng geteilt;
Alle Menschen werden Brüder,
Wo dein sanfter Flügel weilt.

以下のコマンドで行ごとの単語数を返してくれます。

$ cat sample.txt | python word_count.py
3
3
3
3
4
5
4
5

上記のスクリプトは次のような形で使うこともできます。

$ python word_count.py sample.txt

こちらの場合も返ってくる結果は同じです。

こうなるのは、 fileinput.input() は引数が与えられればそれらを cat したような形でまとめて順番に 1 行する処理するようになっているからです。

fileinput にはこの他にもコマンドライン引数にファイルを渡したい場合に便利な関数がもろもろ用意されています。興味があれば公式ドキュメントの方も見てみてください。

参考