2009-04-30 18 views
21

Escribo muchas pequeñas secuencias de comandos que procesan archivos línea por línea. En Perl, yo usoPython equivalente a Perl's while (<>) {...}?

while (<>) { 
    do stuff; 
} 

Esto es muy útil ya que no le importa donde la entrada proviene de (un archivo o entrada estándar).

En Python que utilizan este

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 

que no parece muy elegante. ¿Hay algún modismo de Python que maneje fácilmente la entrada de archivo/stdin?

+1

Desde un punto de vista de "código legible", preferiría su código Python ya que la mayoría de las personas que no trabajan con Perl no sabrán qué significa el código Perl. – schnaader

+4

Puede al menos omitir .readlines() – Jiri

+2

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

Respuesta

49

El módulo fileinput en la biblioteca estándar es justo lo que desea:

import fileinput 

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

De hecho. Un millón de gracias. Lamento haberme perdido la otra pregunta que trata sobre los mismos problemas. Fue difícil de encontrar con este tite ... – Eisen

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

Este itera sobre las líneas de todos los archivos que aparecen en sys.argv [1:], por defecto a sys.stdin si la lista está vacía

+0

Estoy usando los argumentos para otros fines, ¿puedo deshabilitar ese comportamiento? – user1552512

+0

@ user1552512 Sí, consulte https://docs.python.org/2/library/fileinput.html: 'Para especificar una lista alternativa de nombres de archivo, páselo como primer argumento para ingresar(). También se permite un único nombre de archivo. – clacke

7

fileinput por defecto es stdin, por lo que sería un poco más conciso.

Si haces muchas cosas en la línea de comandos, sin embargo, este piping hack es muy limpio.

+0

¡Esa receta de Python es muy clara! ¡Gracias! – Bklyn

Cuestiones relacionadas