2009-04-30 8 views
21

Ich schreibe viele kleine Skripte, die Dateien Zeile für Zeile verarbeiten. In Perl, verwende ichPython-Äquivalent von Perls while (<>) {...}?

while (<>) { 
    do stuff; 
} 

Das ist praktisch, weil es nicht egal ist, wo die Eingabe von (einer Datei oder stdin) kommt.

In Python Ich benutze diese

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 

, die nicht sehr elegant scheint. Gibt es ein Python-Idiom, das die Eingabe von file/stdin problemlos verarbeitet?

+1

Aus Sicht des "lesbaren Codes" würde ich Ihren Python-Code bevorzugen, da die meisten Leute, die nicht mit Perl arbeiten, nicht wissen, was der Perl-Code bedeutet. – schnaader

+4

Sie können mindestens .readlines() – Jiri

+2

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

Antwort

49

Das Modul fileinput in der Standardbibliothek ist genau das, was Sie wollen:

import fileinput 

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

In der Tat. Tausend Dank. Entschuldigung, ich habe die andere Frage verpasst, die sich mit den gleichen Problemen beschäftigt. War schwer zu finden mit dieser tite ... – Eisen

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

Diese iteriert über die Leitungen aller Dateien in sys.argv aufgeführt [1:], sys.stdin an säumige wenn die Liste leer ist.

+0

Ich verwende die Argumente für andere Zwecke, kann ich dieses Verhalten deaktivieren? – user1552512

+0

@ user1552512 Ja, siehe https://docs.python.org/2/library/fileinput.html: 'Um eine alternative Liste von Dateinamen anzugeben, übergeben Sie sie als erstes Argument an input(). Ein einzelner Dateiname ist auch erlaubt. – clacke

7

fileinput Standard auf Standard, also würde es etwas prägnanter machen.

Wenn Sie eine Menge Befehlszeilen-Sachen machen, ist diese piping hack sehr ordentlich.

+0

Dieses Python-Rezept ist sehr ordentlich! Vielen Dank! – Bklyn

Verwandte Themen