2015-07-28 17 views
6

Sto imparando Python. Sarebbe possibile se qualcuno potrebbe spiegare la differenza tra i seguenti per l'elaborazione di un file:Iterating over lines in un file python

file = open("file.txt") 
for line in file: 
    #do something 

file = open("file.txt") 
contents = file.read() 
for line in contents: 
    # do something 

So che nel primo caso, il file agirà come un elenco in modo che iterare su un file come abbiamo iterare gli elementi di una lista ma nel secondo caso, non sono sicuro di come spiegare cosa succede se leggo prima il file e poi lo iterato su di esso?

+0

sarebbe più preciso dire che il 'file' fungerà da generatore' pigro 'nel primo esempio. Il secondo leggerà il contenuto del file in memoria per la lettura. – Anzel

+0

Entrambi sono uguali, per quanto ne so. Il modo migliore per scoprirlo è, __print type (content) s__and __print type (file) __ Quindi possiamo essere certi dei tipi, dove lista o stringa – Nabin

risposta

12

Nel primo si sta iterando il file, riga per riga. In questo scenario, i dati dell'intero file non vengono letti nella memoria, ma solo la riga corrente viene letta in memoria, utile per gestire file di grandi dimensioni.

Nella seconda, file.read() restituisce i dati di file completi sotto forma di stringa, quando si esegue l'iterazione su di esso, si sta effettivamente iterando sui dati del file carattere per carattere. Questo legge i dati del file completo in memoria.

esempio per mostrare questo comportamento -

file di a.txt contiene -

Hello 
Bye 

Codice

>>> f = open('a.txt','r') 
>>> for l in f: 
...  print(l) 
... 
Hello 

Bye 


>>> f = open('a.txt','r') 
>>> r = f.read() 
>>> print(repr(r)) 
'Hello\nBye' 
>>> for c in r: 
...  print(c) 
... 
H 
e 
l 
l 
o 


B 
y 
e 
+3

Anche il secondo legge l'intero file in memoria, mentre il primo, una riga per iterazione. Detto questo, il primo è efficiente in termini di memoria, soprattutto per i file di grandi dimensioni. – geompalik

+0

@geompalik Grazie, ho aggiunto anche alla mia risposta. –

4

Il secondo caso legge i contenuti del file in un unico grande stringa. Se si itera su una stringa, si ottiene a turno ogni personaggio. Se si desidera ottenere ogni riga, a sua volta, si può fare questo:

for line in contents.split('\n'): 
    # do something 

Oppure si può leggere il contenuto come un elenco di linee usando readlines() invece di read().

with open('file.txt','r') as fin: 
    lines = fin.readlines() 
for line in lines: 
    # do something 
+1

Invece di dividere la stringa ad ogni nuova riga ('\ n') puoi anche usare il metodo' readlines': 'per la riga in file.readlines(): print line'. Questo restituisce un elenco di stringhe separate sul carattere di nuova riga. – cezar