2013-03-24 3 views

risposta

128

loop sopra il file da leggere linee:

with open('somefile') as openfileobject: 
    for line in openfileobject: 
     do_something() 

oggetti File sono linee iterabili e rendimento fino EOF. L'utilizzo dell'oggetto file come iterable utilizza un buffer per garantire letture performanti.

Si può fare lo stesso con lo stdin (non c'è bisogno di usare raw_input():

import sys 

for line in sys.stdin: 
    do_something() 

Per completare il quadro, binario si legge può essere fatto con:

from functools import partial 

with open('somefile', 'rb') as openfileobject: 
    for chunk in iter(partial(openfileobject.read, 1024), ''): 
     do_something() 

dove chunk conterrà up a 1024 byte alla volta dal file.

+1

Grazie, BTW, come posso fare questo per raw_input(), ovvero l'input std. –

+1

devi usare 'sys.stdin' per farlo – jozefg

+1

Grazie, la parte" sys.stdin "mi aiuta davvero. –

15

L'idioma di Python per aprire un file e leggerlo riga per riga è:

with open('filename') as f: 
    for line in f: 
     do_something(line) 

Il file verrà automaticamente chiuso alla fine del codice di cui sopra (il costrutto with si occupa di ciò).

Infine, vale la pena notare che line conserva la riga finale finale. Questo può essere facilmente rimosso usando:

line = line.rstrip() 
+1

+1, anche indicando all'OP che questo è * non * uguale al molto simile 'per linea in f.readlines(): ...', una soluzione comunemente suggerita. – jedwards

40

È possibile imitare l'idioma C in Python.

Per leggere un buffer fino a max_size numero di byte, si può fare questo:

with open(filename,'rb') as f: 
    while True: 
     buf=f.read(max_size) 
     if not buf: break 
     process(buf) 

Oppure, una linea di file di testo per riga:

# warning -- not idiomatic Python! See below... 
with open(filename,'rb') as f: 
    while True: 
     line=f.readline() 
     if not line: break 
     process(line) 

È necessario utilizzare while True/break costrutto dal c'è lo no eof test in Python oltre alla mancanza di byte restituiti da una lettura.

In C, si potrebbe avere:

while ((ch != '\n') && (ch != EOF)){ 
    // read the next ch and add to a buffer 
    // .. 
} 

Tuttavia, non si può avere questo in Python:

while(line=f.readline()): 
    # syntax error 

perché assignments are not allowed in expressions in Python.

è certamente più idiomatica in Python per fare questo:

# THIS IS IDIOMATIC Python. Do this: 
with open('somefile') as f: 
    for line in f: 
     process(line) 
+0

Che cosa * non * restituisce le linee, ovviamente. –

+0

@MartijnPieters: Ora funziona :-) – dawg

+3

Come programmatore C e Perl, il tuo punto è che ** [le assegnazioni non sono consentite nelle espressioni] (http://docs.python.org/2/faq/design.html# why-can-ti-use-an-assignment-in-an-expression) ** è stato fondamentale per me. –

3

a leggere riga per riga È possibile utilizzare sotto frammento di codice, fino alla fine del file di

line = obj.readline() 
while(line != ''): 

    # Do Something 

    line = obj.readline() 
+1

IMO, questa è l'unica risposta che meglio riflette ciò che è stato chiesto. – gvrocha

1

È possibile utilizzare il seguente frammento di codice. readlines() legge l'intero file in una volta e lo divide per riga.

line = obj.readlines() 
6

Mentre ci sono suggerimenti di cui sopra per "farlo nel modo python", se si vuole avere davvero una logica basata su EOF, quindi suppongo che utilizzando la gestione delle eccezioni è il modo per farlo -

try: 
    line = raw_input() 
    ... whatever needs to be done incase of no EOF ... 
except EOFError: 
    ... whatever needs to be done incase of EOF ... 

Esempio:

$ echo test | python -c "while True: print raw_input()" 
test 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
EOFError: EOF when reading a line 

Oppure premere Ctrl-Z ad un prompt di raw_input() (Windows, Ctrl-Z Linux)

+0

@TessellatingHeckler che non è quello [la documentazione] (https://docs.python.org/2/library/exceptions.html#exceptions.EOFError) dice: "Sollevato quando una delle funzioni built-in (input () o raw_input()) colpisce una condizione di fine file (EOF) senza leggere alcun dato. " –

+1

@ TadhgMcDonald-Jensen Beh, hey, così sarà. Che strano. Falso reclamo ritirato e ingiustificato downvot rimosso. – TessellatingHeckler

Problemi correlati