2009-09-25 3 views
22

ich häufig Python Code ähnlichfür Zeile in offenen (Dateiname)

for line in open(filename): 
    do_something(line) 

Wann Dateinamen mit diesem Code sehen geschlossen werden?

Wäre es besser, schreiben

with open(filename) as f: 
    for line in f.readlines(): 
     do_something(line) 

Antwort

32

filename wäre geschlossen, wenn es außerhalb des Geltungsbereichs fällt. Das wäre normalerweise das Ende der Methode.

Ja, es ist besser zu verwenden with.

Sobald Sie ein Dateiobjekt haben, führen Sie alle Datei-I/O durch Aufruf Methoden dieses Objekts. [...] Wenn Sie mit der Datei fertig sind, können Sie durch den Aufruf der close Methode für das Objekt beenden sollte, die Verbindung zur Datei zu schließen:

input.close() 

Kurz Skripte, lassen die Menschen oft diesen Schritt, Da Python die Datei automatisch schließt, wenn ein Dateiobjekt während der Garbage-Collection zurückgewonnen wird (was in Mainstream-Python bedeutet, dass die Datei nahezu geschlossen ist, obwohl andere wichtige Python-Implementierungen, wie Jython und IronPython, andere, entspanntere Garbage-Collection-Strategien haben). Nichtsdestotrotz ist es gute Programmierpraxis, Ihre Dateien so schnell wie möglich zu schließen, und es ist besonders eine gute Idee in größeren Programmen, die anderenfalls einem größeren Risiko ausgesetzt sind, übermäßig viele nutzlos geöffnete Dateien herumliegen zu lassen. Beachten Sie, dass try/finally besonders gut dafür geeignet ist, dass eine Datei geschlossen wird, selbst wenn eine Funktion aufgrund einer nicht abgefangenen Ausnahme beendet wird.

Python Cookbook, Page 59.

+0

Ich denke, du meinst 'f' statt' filename' in "' filename' wäre geschlossen ... " –

+0

Ich meinte, dass das mit' open (filename) 'erstellte Objekt geschlossen wäre, wenn es außerhalb des Gültigkeitsbereichs fällt , dh wenn die Iteration endet. – voyager

+0

Es wäre geschlossen, wenn die for-Schleife endet oder am Ende der entsprechenden Methode? – foosion

9

Der with Teil besser ist, weil es die Datei danach schließen. Sie müssen nicht einmal readlines() verwenden. for line in file ist genug.

Ich denke nicht, dass der erste es schließt.

2

Python ist Garbage Collection - CPython hat Referenzzählung und einen Sicherungszyklus Erfassen garbage collector.

Dateiobjekte schließen ihre Dateizugriffsnummer, wenn sie gelöscht/finalisiert werden.

Somit wird die Datei schließlich geschlossen und in cpython wird geschlossen, sobald die for-Schleife beendet ist.

4

Drop .readlines(). Es ist redundant und unerwünscht für große Dateien (aufgrund des Speicherverbrauchs). Die Variante mit 'with' Baustein schließt Datei immer.

with open(filename) as file_: 
    for line in file_: 
     do_something(line) 

Wenn Datei wird in der bloßen 'for' -loop Variante geschlossen werden, hängt von Implementierung Python.

+0

Dex erwähnt das Löschen von readlines() eine Weile zurück. >> hängt von der Python-Implementierung ab >> Das könnte der Grund sein, warum verschiedene Leute unterschiedliche Antworten geben. – foosion