2012-04-21 14 views
38

Ho un problema di capire l'iterazione su un file, Qui vado su quello che digito sulla interprete e il risultato:iterazione su un file utilizzando Python

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 

>>> ... 
>>> ... all the lines from the file appear here 
>>> ... 

Quando provo a iterare sulla stessa aperta file di nuovo non ho trovato nulla !!!!

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 
>>> 
>>> 

Non v'è alcuna uscita a tutti, per risolvere questo ho per chiudere() il file quindi aprirlo di nuovo per la lettura !! È un comportamento normale?

risposta

61

Sì, questo è un comportamento normale. In pratica si legge la fine del file per la prima volta (è possibile immaginarlo come se leggesse un nastro), quindi non si può più leggere da esso a meno che non lo si ripristini, usando f.seek(0) per riposizionarlo all'inizio di il file, o per chiuderlo e quindi riaprirlo che inizierà dall'inizio del file.

Se si preferisce, è possibile utilizzare la sintassi with che chiuderà automaticamente il file.

esempio,

with open('baby1990.html', 'rU') as f: 
    for line in f: 
    print line 

una volta che questo blocco è terminato l'esecuzione, il file viene automaticamente chiusa per voi, così si potrebbe eseguire questo blocco ripetutamente senza esplicitamente chiudere il file se stessi e leggere il file in questo modo ancora una volta.

+0

OP vuole aiutare a capire cosa sta succedendo quando un oggetto file è consumato –

+0

Ho appena aggiunto quella parte della spiegazione – Levon

+1

Non c'è motivo di leggere il file due volte se stai usando 'readlines()'. –

1

Naturalmente. Questo è un comportamento normale e sano. Invece di chiudere e riaprire, è possibile il file rewind.

+0

Questo non è utile per un utente che non ha familiarità con il concetto di lettura puntatore – scubbo

8

L'oggetto file è un buffer. Quando si legge dal buffer, la parte che si legge viene consumata (la posizione di lettura viene spostata in avanti). Quando si legge l'intero file, la posizione di lettura si trova su EOF, quindi non restituisce nulla perché non è rimasto nulla da leggere.

Se è necessario, per qualche ragione, reimpostare la posizione di lettura su un oggetto file, si può fare:

f.seek(0) 
13

Come l'oggetto file legge il file, utilizza un puntatore a tenere traccia di dove è. Se leggi una parte del file, poi torna indietro in seguito riprenderà da dove hai lasciato. Se si legge l'intero file e si torna allo stesso oggetto file, sarà come leggere un file vuoto perché il puntatore si trova alla fine del file e non c'è nulla da leggere. È possibile utilizzare file.tell() per vedere in che punto del file si trova il puntatore e file.seek per impostare il puntatore. Per esempio:

>>> file = open('myfile.txt') 
>>> file.tell() 
0 
>>> file.readline() 
'one\n' 
>>> file.tell() 
4L 
>>> file.readline() 
'2\n' 
>>> file.tell() 
6L 
>>> file.seek(4) 
>>> file.readline() 
'2\n' 

Inoltre, si dovrebbe sapere che file.readlines() legge l'intero file e lo memorizza in una lista.Questo è utile sapere perché si può sostituire:

for line in file.readlines(): 
    #do stuff 
file.seek(0) 
for line in file.readlines(): 
    #do more stuff 

con:

lines = file.readlines() 
for each_line in lines: 
    #do stuff 
for each_line in lines: 
    #do more stuff 

È inoltre possibile iterare su un file, una riga alla volta, senza tenere l'intero file in memoria (questo può essere molto utile per i file di grandi dimensioni) facendo:

for line in file: 
    #do stuff 
Problemi correlati