2013-06-07 11 views
5

Ho un file "test.txt":È oggetto file in python un iterabile

this is 1st line 
this is 2nd line 
this is 3rd line 

il seguente codice

lines = open("test.txt", 'r') 
for line in lines: 
    print "loop 1:"+line 
for line in lines: 
    print "loop 2:"+line 

solo stampe:

loop 1:this is 1st line 

loop 1:this is 2nd line 

loop 1:this is 3rd line 

E doesn' t stampare loop2 a tutti.

due domande:

  1. l'oggetto file restituito da open(), si tratta di un iterabile? è per questo che può essere usato in un ciclo for?

  2. perché loop2 non viene stampato?

risposta

24

non è solo un iterabile, è un iteratore, è per questo che può attraversare solo il file una volta. È possibile ripristinare il cursore del file con .seek(0) come molti hanno suggerito ma, nella maggior parte dei casi, si dovrebbe solo iterare un file una volta.

+1

+1 per una descrizione chiara e concisa della cosa iterabile-contro-iteratore (che la maggior parte delle altre risposte non ha nemmeno tentato, anche se è la chiave della domanda). – abarnert

+0

Grazie per la descrizione. – martinbshp

1

Si è già alla fine del file. Gli oggetti file sono iteratori. Una volta iterato su di loro, sei nella posizione finale. L'iterazione di nuovo non inizierà dall'inizio. Se si desidera iniziare nuovamente dalla prima riga, è necessario utilizzare lines.seek(0).

+0

Questo è fuorviante. 'list's sono anche iterabili, eppure è possibile scorrere nuovamente su di essi senza un' seek' o equivalente. Il problema è che gli oggetti file sono _iterators_ (oltre ad essere iterabili). – abarnert

+0

Typo. Intendevo iteratore. Grazie. Fisso. –

2

Sì, gli oggetti file sono iteratori.

Come tutti gli iteratori, è possibile eseguire il loop su di essi una volta, dopo di che l'iteratore è esaurito. Il puntatore di lettura del file si trova alla fine del file. Riapri il file o usa .seek(0) per riavvolgere il puntatore del file se hai bisogno di ripetere il ciclo.

In alternativa, provare a evitare il loop su un file due volte; estrae ciò che ti serve in un'altra infrastruttura (elenco, dizionario, set, heap, ecc.) durante il primo ciclo.

2

Sì, gli oggetti file sono iterabili ma per tornare all'inizio del file è necessario utilizzare lines.seek(0), poiché dopo il primo ciclo ci si trova alla fine del file.

0

Sarebbe meglio, tuttavia, riscrivere il codice in modo che il file non debba essere iterato due volte. Leggi tutte le linee in un elenco di qualche tipo, o esegui tutte le elaborazioni in un unico ciclo.