2011-10-27 3 views
7

Sto provando a leggere un'enorme quantità di righe dallo standard input con python.Python: leggere un numero enorme di righe dallo stdin

more hugefile.txt | python readstdin.py 

Il problema è che il programma si blocca non appena ho letto una sola riga.

print sys.stdin.read(8) 
exit(1) 

Questo stampa i primi 8 byte ma poi mi aspetto che termini, ma non lo fa mai. Penso che non si tratta solo di leggere i primi byte, ma di cercare di leggere l'intero file in memoria.

stesso problema con sys.stdin.readline()

quello che voglio fare è, naturalmente, di leggere tutte le linee, ma con un buffer in modo che io non esaurire la memoria.

sto usando Python 2.6

+4

perché stai usando più invece di gatto o anche solo un semplice redirect di stdin? –

+0

Non vedo alcun motivo per cui il programma si "congela". Come stai scoprendo che si blocca? –

+0

Ah stavo eseguendo da riga di comando di Windows. Nessun gatto su Windows. – Martin

risposta

11

Questo dovrebbe funzionare in modo efficiente in un Python moderna:

import sys 

for line in sys.stdin: 
    # do something... 
    print line, 

È quindi possibile eseguire lo script come questo:

python readstdin.py < hugefile.txt 
+0

Come funziona la memoria qui? Carica una sola riga alla volta e la rimuove dal buffer quando la riga successiva viene letta? Grazie –

+0

Sì, legge una riga alla volta e la imposta sulla variabile di linea. I vecchi valori per la linea verranno recuperati man mano che vengono persi. –