2009-04-30 21 views
21

Scrivo un sacco di piccoli script che elaborano i file riga per riga. In Perl, io usoEquivalente Python di Perl's while (<>) {...}?

while (<>) { 
    do stuff; 
} 

Questo è comodo perché non importa dove l'input proviene da (un file o stdin).

In Python Io uso questo

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 

che non sembra molto elegante. Esiste un idioma Python che gestisce facilmente l'input di file/stdin?

+1

Dal punto di vista del "codice leggibile", preferirei il codice Python dato che la maggior parte delle persone che non lavorano con Perl non sapranno cosa significa il codice Perl. – schnaader

+4

Puoi almeno omettere .readlines() – Jiri

+2

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

risposta

49

Il modulo fileinput nella libreria standard è proprio quello che si vuole:

import fileinput 

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

In effetti. Grazie mille. Mi dispiace ho perso l'altra domanda che si occupa degli stessi problemi. Era difficile da trovare con questo tite ... – Eisen

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

Questo itera oltre le linee di tutti i file elencati in sys.argv [1:], inadempiente a sys.stdin se la lista è vuota

+0

Sto usando gli argomenti per altri scopi, posso disabilitare quel comportamento? – user1552512

+0

@ user1552512 Sì, consultare https://docs.python.org/2/library/fileinput.html: 'Per specificare un elenco alternativo di nomi di file, passarlo come primo argomento di input(). È anche consentito un singolo nome di file. – clacke

7

fileinput predefinito per lo stdin, quindi lo renderebbe leggermente più conciso.

Se si esegue molta roba da riga di comando, tuttavia, questo piping hack è molto ordinato.

+0

Questa ricetta Python è molto bella! Grazie! – Bklyn

Problemi correlati