2009-04-30 15 views
21

ファイルを1行ずつ処理する小さなスクリプトをたくさん書きます。 Perlでは、私が使用していますPerlのPythonに相当するwhile(<>){...}?

while (<>) { 
    do stuff; 
} 

これは、入力がどこから来るか気にしないので便利です(ファイルまたは標準入力)。

はPythonでは、私は非常にエレガントないないようです。この

if len(sys.argv) == 2: # there's a command line argument 
    sys.stdin = file(sys.argv[1]) 
for line in sys.stdin.readlines(): 
    do stuff 

を使用しています。 file/stdinの入力を簡単に処理するPythonのイディオムはありますか? sys.stdinをする不履行、

+1

「読み取り可能なコード」の観点からは、Perlのコードが何を意味するのかわからないため、ほとんどの人がPerlを使用しないため、Pythonコードを好むでしょう。 – schnaader

+4

少なくとも.readlines()を省略することができます – Jiri

+2

重複:http://stackoverflow.com/questions/715277/how-do-i-iterate-over-all-lines-of-files-passed-on-the-commandline -in-python –

答えて

49

標準ライブラリのFileInputクラスモジュールは、あなたが望むだけのものです::

import fileinput 

for line in fileinput.input(): ... 
+0

実際に。感謝万円。申し訳ありませんが、私は同じ問題を扱う他の質問を逃しました。このタイトで見つけにくかったです... – Eisen

15
import fileinput 
for line in fileinput.input(): 
    process(line) 

sys.argvのにリストされているすべてのファイルの行の上にこの繰り返し処理[1]リストが空の場合

+0

私は他の目的のために引数を使用していますが、その動作を無効にすることはできますか? – user1552512

+0

@ user1552512はい、https://docs.python.org/2/library/fileinput.htmlを参照してください: 'ファイル名の代替リストを指定するには、input()の最初の引数として渡します。単一のファイル名も許されています。 ' – clacke

7

fileinputはデフォルトで標準入力になっているため、やや簡潔になります。

しかし、多くのコマンドラインを実行すると、このpiping hackはきれいです。

+0

Pythonのレシピはとても素敵です!ありがとう! – Bklyn