Risposte:
Fai scorrere il file per leggere le righe:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Gli oggetti file sono iterabili e producono righe fino a EOF. L'utilizzo dell'oggetto file come iterabile utilizza un buffer per garantire letture performanti.
Puoi fare lo stesso con lo stdin (non è necessario usare raw_input()
:
import sys
for line in sys.stdin:
do_something()
Per completare l'immagine, le letture binarie possono essere eseguite con:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
dove chunk
conterrà fino a 1024 byte alla volta dal file e l'iterazione si interrompe quando openfileobject.read(1024)
inizia a restituire stringhe di byte vuote.
stdin
processo in esecuzione ... quindi non ha mai EOF finché non uccido il processo. Ma poi arrivo alla "fine fino ad ora" e sono in stallo. Come lo rilevo e non il deadlock? Come se non ci fossero nuove righe, smetti di leggere i file (anche se non c'è un EOF, che nel mio caso non esisterà mai).
Puoi imitare l'idioma C in Python.
Per leggere un buffer fino al max_size
numero di byte, puoi fare questo:
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
Oppure un file di testo riga 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 il while True / break
costrutto poiché non esiste un test eof in Python oltre alla mancanza di byte restituiti da una lettura.
In C, potresti avere:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
Tuttavia, non puoi avere questo in Python:
while (line = f.readline()):
# syntax error
perché le assegnazioni non sono consentite nelle espressioni in Python (sebbene le versioni recenti di Python possano imitarle utilizzando le espressioni di assegnazione, vedi sotto).
È certamente più idiomatico in Python fare questo:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
Aggiornamento: a partire da Python 3.8 puoi anche usare espressioni di assegnazione :
while line := f.readline():
process(line)
readline()
: puoi gestire gli errori a grana fine, come la cattura UnicodeDecodeError
, che non puoi fare con l' for
iterazione idiomatica .
L'idioma 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 precedente (il with
costrutto se ne occupa).
Infine, vale la pena notare che line
manterrà la nuova riga finale. Questo può essere facilmente rimosso utilizzando:
line = line.rstrip()
for line in f.readlines(): ...
, una soluzione comunemente suggerita.
Puoi usare lo snippet di codice qui sotto per leggere riga per riga, fino alla fine del file
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
Sebbene ci siano suggerimenti sopra per "farlo in modo python", se si vuole davvero avere una logica basata su EOF, allora suppongo che usare la gestione delle eccezioni sia 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-Zquando raw_input()
richiesto (Windows, Ctrl-ZLinux)
Puoi utilizzare il seguente frammento di codice. readlines () legge l'intero file in una volta e lo divide per riga.
line = obj.readlines()
line
avrà un nuovo carattere di riga alla fine.