2012-06-21 9 views
13

Ich versuche, die Abwägungen/Unterschiede zwischen diesen zu Weisen Öffnen von Dateien für line-by-line Verarbeitungline-by-line Dateiverarbeitung, for-Schleife vs mit

with open('data.txt') as inf: 
    for line in inf: 
     #etc 

vs

zu verstehen
for line in open('data.txt'): 
    # etc 

ich verstehe, dass with mit der Datei gewährleistet wird geschlossen, wenn die „mit-Block“ (Suite?) verlassen (oder eine Ausnahme begegnet ist). So habe ich with verwendet, seit ich hier darüber erfahren habe.

Re for -loop: um das Netz von der Suche und SO, scheint es, dass, ob die Datei geschlossen, wenn der for -loop verlassen wird, ist abhängig von der Implementierung? Und Ich konnte nichts darüber finden, wie dieses Konstrukt mit Ausnahmen umgehen würde. Weiß jemand?

Wenn ich etwas täuscht über oben, würde ich Korrekturen schätzen, sonst gibt es einen Grund jemals das for Konstrukt über die with zu benutzen? (Vorausgesetzt, Sie haben eine Wahl, d. H. Sind nicht durch Python-Version beschränkt)

Antwort

21

Das Problem bei diesem

for line in open('data.txt'): 
    # etc 

ist, dass Sie die geöffnete Datei einen ausdrücklichen Hinweis nicht halten, so wie schließen Sie es? Der faule Weg ist warten auf den Müllsammler, um es aufzuräumen, aber das kann bedeuten, dass die Ressourcen nicht rechtzeitig freigegeben werden.

So können Sie

inf = open('data.txt') 
for line in inf: 
    # etc 
inf.close() 

Jetzt sagen, was passiert, wenn es eine Ausnahme ist, während Sie innerhalb der for-Schleife sind? Die Datei wird nicht explizit geschlossen.

eine Dieser try/finally

inf = open('data.txt') 
try: 
    for line in inf: 
     # etc 
finally: 
    inf.close() 

hinzufügen viel Code ist etwas ziemlich einfach, dies zu tun, Python with diesen Code zu ermöglichen, hinzugefügt in eine besser lesbare Art und Weise geschrieben werden. Was uns hierher bringt

with open('data.txt') as inf: 
    for line in inf: 
     #etc 

Also, das ist der bevorzugte Weg, um die Datei zu öffnen. Wenn Ihr Python für die with-Anweisung zu alt ist, sollten Sie die try/finally-Version für den Produktionscode

2

Die With-Anweisung wurde nur in Python 2.5 eingeführt - nur wenn Sie Abwärtskompatibilität Anforderungen für frühere Versionen haben sollten Sie letztere verwenden.

Bit mehr Klarheit

Die mit Anweisung eingeführt wurde (wie Sie bewusst sind), um die try/except/finally System zu umfassen - was nicht großartig zu verstehen ist, aber okay. In Python (dem Python in C) schließt die Implementierung geöffneter Dateien. Die Spezifikation der Sprache selbst sagt nicht ... also IPython, JPython etc ... können wählen, Dateien offen zu halten, Speicher offen, was auch immer und nicht freie Ressourcen bis zum nächsten GC Zyklus (oder überhaupt, aber die CPython GC unterscheidet sich von .NET oder Java ...).

Ich denke, das einzige, was ich dagegen gehört habe, ist, dass es eine weitere Einrückungsebene hinzufügt.

Also zusammenzufassen: wird nicht funktionieren < 2.5, führt das Schlüsselwort 'as' ein und fügt eine Einrückungsebene hinzu.

Ansonsten behalten Sie die Kontrolle über die Behandlung von Ausnahmen als normal, und der finally Block schließt Ressourcen, wenn etwas entkommt.

Funktioniert für mich!

+0

verwenden. Guter Punkt. Ich hätte etwas sagen sollen, wenn Sie die Wahl haben - dh, Sie sind nicht auf Versionen beschränkt .. Ich werde die Frage aktualisieren. Deine Stimme würde also zu "mit" gehen? – Levon

+0

Ich denke, die Einrückung ist ein Vorteil, da es den Abschnitt bezeichnet, der in einem bestimmten Kontext ist. Sie müssten indessen einrücken, um den gesamten Block in einen Versuch zu wickeln, außer dass die Datei im endgültigen Block – jdi

+0

@jdl guten Punkt schließt - aber bitte lassen Sie wissen, dass das Einrückungsproblem nicht eins war, das ich erwähnte - nur eines, das ich erwähnt habe bemerkte es vor Jahren auf Listen und Gruppen. –