2015-07-28 14 views
6

Ich lerne Python. Wäre es möglich, wenn jemand den Unterschied zwischen der folgenden für die Verarbeitung einer Datei erklären könnte:Iterieren über Zeilen in einer Datei Python

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

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

Ich weiß, dass im ersten Fall, wird die Datei als eine Liste handeln so iterieren wir über eine Datei, wie wir über iterieren die Elemente einer Liste, aber im zweiten Fall bin ich mir nicht sicher, wie ich erklären soll, was passiert, wenn ich zuerst die Datei lese und dann darüber iteriere?

+0

wäre genauer gesagt zu sagen, die 'Datei' wird als ein fauler' Generator' in der ersten Probe handeln. Der zweite liest den Dateiinhalt im Speicher zum Lesen. – Anzel

+0

Beide sind die gleichen, soweit ich weiß. Der beste Weg, um herauszufinden, ist, __print Typ (Inhalt) s__und __print Typ (Datei) __ Dann können wir sicher sein, die Typen, wo Liste oder Zeichenfolge – Nabin

Antwort

12

In der ersten Zeile durchlaufen Sie Zeile für Zeile die Datei. In diesem Szenario werden die gesamten Dateidaten nicht in den Speicher gelesen, stattdessen wird nur die aktuelle Zeile in den Speicher gelesen, dies ist nützlich für die Verarbeitung sehr großer Dateien.

Im zweiten gibt file.read() die vollständigen Dateidaten als Zeichenfolge zurück. Wenn Sie darüber iterieren, durchlaufen Sie tatsächlich die Daten der Datei Zeichen für Zeichen. Dies liest die vollständigen Dateidaten in den Speicher.

Beispiel dieses Verhalten zeigen -

a.txt Datei enthält -

Hello 
Bye 

-Code

>>> 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

Auch die zweite liest die ganze Datei im Speicher, während die erste, eine Zeile pro Iteration. Das heißt, das erste ist speichereffizient, insbesondere für große Dateien. – geompalik

+0

@geompalik Danke, das habe ich auch zu meiner Antwort hinzugefügt. –

4

Der zweite Fall liest die Inhalte der Datei in eine große Zeichenfolge. Wenn Sie über eine Zeichenfolge iterieren, erhalten Sie nacheinander jedes Zeichen. Wenn Sie jede Zeile wiederum erhalten möchten, können Sie dies tun:

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

Oder Sie können in den Inhalten als eine Liste von Linien mit readlines() statt read() lesen.

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

Anstatt den String bei jeder neuen Zeile zu teilen ('\ n'), können Sie auch die Methode' readlines': 'für Zeile in file.readlines(): print line' verwenden. Dies gibt eine Liste von Zeichenfolgen zurück, die durch Zeilenumbruchzeichen getrennt sind. – cezar

Verwandte Themen