So öffnen / schließen Sie Dateien in Python 2.4 sicher


86

Ich schreibe gerade ein kleines Skript zur Verwendung auf einem unserer Server mit Python. Auf dem Server ist nur Python 2.4.4 installiert.

Ich habe Python erst mit 2.5 verwendet, daher bin ich an das folgende Formular gewöhnt:

with open('file.txt', 'r') as f:
    # do stuff with f

Es gibt jedoch keine withAnweisung vor 2.5, und ich habe Probleme, Beispiele für die ordnungsgemäße manuelle Bereinigung eines Dateiobjekts zu finden.

Was ist die beste Vorgehensweise zum sicheren Entsorgen von Dateiobjekten bei Verwendung alter Python-Versionen?

Antworten:


137

Siehe docs.python.org :

Wenn Sie mit einer Datei fertig sind, rufen Sie f.close () auf, um sie zu schließen und alle Systemressourcen freizugeben, die von der geöffneten Datei belegt werden. Nach dem Aufruf von f.close () schlagen Versuche, das Dateiobjekt zu verwenden, automatisch fehl.

Verwenden Sie daher close()elegant mit try/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

Dies stellt sicher, dass auch wenn # do stuff with feine Ausnahme ausgelöst fwird, diese ordnungsgemäß geschlossen wird.

Beachten Sie, dass außerhalb des angezeigt werden opensollte . Wenn selbst eine Ausnahme ausgelöst wird, wurde die Datei nicht geöffnet und muss nicht geschlossen werden. Wenn eine Ausnahme ausgelöst wird, wird das Ergebnis nicht zugewiesen und es ist ein Fehler beim Aufrufen .tryopenopenff.close()


Sehr einfach, danke. Aus irgendeinem Grund hatte ich erwartet, dass ich etwas mehr involvieren müsste.
TM.

16
Wenn dies openfehlschlägt, wird eine Ausnahme ausgelöst, bevor der try/finallyBlock überhaupt eingegeben wird. Also closewird nicht gerufen. (Deshalb sollten Sie openvor dem anrufen try.)
FogleBird

1
@ TM Ich habe einen Hinweis zum Auslösen openeiner Ausnahme hinzugefügt .
Jon-Eric

4
Dies ist, was die with-Anweisung hinter den Kulissen übersetzt.
Arlaharen

1
Das Öffnen der Datei sollte innerhalb des Versuchs erfolgen.
Anthony Rutledge

32

In der obigen Lösung hier wiederholt:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

Wenn nach dem erfolgreichen Öffnen der Datei und vor dem Versuch etwas Schlimmes passiert (Sie wissen es nie ...), wird die Datei nicht geschlossen. Eine sicherere Lösung ist daher:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()

Mit einer with open (...) Anweisung, egal wie der with Block fertig ist (auch mit einer Ausnahme), wird die Datei geschlossen
darkgaze

@darkgaze with open(...)ist definitiv die beste Wahl in modernem Python.
mljrg

11

Sie müssen die Datei nicht gemäß den Dokumenten schließen, wenn Sie Folgendes verwenden:

Es wird empfohlen, das Schlüsselwort with zu verwenden, wenn Sie mit Dateiobjekten arbeiten. Dies hat den Vorteil, dass die Datei nach Abschluss der Suite ordnungsgemäß geschlossen wird, auch wenn unterwegs eine Ausnahme ausgelöst wird. Es ist auch viel kürzer als das Schreiben gleichwertiger Try-finally-Blöcke:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Mehr hier: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


Dies ist sowohl richtig als auch ohne Rücksicht auf die Frage.
Jon-Eric

-4

Hier ist ein Beispiel angegeben, wie man es benutzt openund "Python"close

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

Es ist notwendig, wie oft Sie die Datei geöffnet haben, um diese Zeiten zu schließen.


1
Wenn nach, openaber vorher eine Ausnahme closeausgelöst wird, wird die Datei mit diesem Ansatz nicht ordnungsgemäß geschlossen. Mit withoder try/ finallyschließt die Datei korrekt auch in Gegenwart von Ausnahmen.
Jon-Eric
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.