2011-10-17 61 views
7

Tenemos un par de archivos enormes (más grandes que el tamaño de la RAM) en el disco. Quiero leerlos línea por línea en python y los resultados de salida en la terminal. He pasado por [1] y [2], pero estoy buscando métodos que no esperen hasta que todo el archivo se lea en la memoria.Cómo leer un archivo (o stdin) línea por línea en Python no esperando la lectura del archivo completo

I estaría utilizando ambos de estos comandos:

cat fileName | python myScript1.py 
python myScript2.py fileName 

[1] How do you read from stdin in Python? [2] How do I write a unix filter in python?

Respuesta

8

Este es el standard behavior of file objects en Python:

with open("myfile.txt", "r") as myfile: 
    for line in myfile: 
     # do something with the current line 

o

for line in sys.stdin: 
    # do something with the current line 
+0

Gracias por la respuesta rápida. – BiGYaN

4

Sólo iterar sobre la file:

with open('huge.file') as hf: 
    for line in hf: 
    if 'important' in line: 
     print(line) 

Esto requerirá O (1) memoria.

Para leer de la entrada estándar, simplemente iterar sobre sys.stdin en lugar de hf:

import sys 
for line in sys.stdin: 
    if 'important' in line: 
    print(line) 
+0

Yo soy muy novato pitón, se puede explicar por favor "simplemente iterar sobre sys.stdin en lugar de HF". ¿Quieres decir 'for line in sys.stdin'? – BiGYaN

+1

Sí, 'sys.stdin' es solo un [objeto de archivo] (http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin) que se comporta como un archivo que ha abierto manualmente. –

0
if __name__ == '__main__': 
    while 1: 
     try: 
      a=raw_input() 
     except EOFError: 
      break 
     print a 

Esto leerá desde stdin hasta EOF. para leer un archivo usando el segundo método, se puede utilizar el método de Tim

decir

with open("myfile.txt", "r") as myfile: 
    for line in myfile: 
     print line 
     # do something with the current line 
+0

Gracias por ambos métodos :) – BiGYaN

+2

Este método para leer de stdin es extremadamente engorroso. 'sys.stdin' es un objeto similar a un archivo y se puede usar en su lugar. – phihag

Cuestiones relacionadas