2010-03-08 4 views

Antwort

17

Es sollte die Datei-Handle in der __del__ Erklärung der Datei schließen, aber ein besserer Ansatz einen with Block zu verwenden wäre:

def read_contents(file_path): 
    with open(file_path, 'r') as f: 
    return f.read() 

Siehe http://docs.python.org/library/stdtypes.html#file.close für weitere Informationen.

+0

Nur zu erwähnen: Datei gibt ein Dateiobjekt zurück, das eine close-Methode hat. Das wäre die einfachste Lösung, aber "mit" ist offensichtlich die bessere Lösung. – Achim

+0

Ich habe ein Problem - ich habe nicht 'mit' in meinem Python. Ist es in Ordnung, aus der Zukunft zu importieren? Ich habe Python 2.5. – bodacydo

+0

Wenn Sie Python 2.5 haben, dann ja. –

28

Um die FogleBird-Antwort zu erweitern, wird die Datei automatisch geschlossen, wenn das Dateiobjekt zerstört wird. In CPython wird dies geschehen, sobald es keine Referenzen mehr gibt, z. wenn es sich um eine lokale Variable in einer Funktion handelt und die Funktion endet. Wenn jedoch eine Ausnahme in der Funktion ausgelöst wird und die Datei nicht explizit mit einer with-Anweisung oder try:...finally: geschlossen wird, wird ein Verweis auf die Datei als Teil des Stack-Trace im traceback-Objekt beibehalten, und die Datei wird nicht geschlossen, um mindestens bis die nächste Ausnahme ausgelöst wird.

Auch IronPython und Jython verwenden die Speicherbereinigungsfunktionen der .NET CLR bzw. Java JVM. Diese werden nicht gezählt, so dass die Datei unbegrenzt geöffnet bleibt, bis der Garbage Collector entscheidet, den Speicher des Objekts zurückzufordern oder das Programm beendet wird.

Im Allgemeinen ist es wichtig, die Datei explizit mit with: oder try:...finally: zu schließen.

Natürlich gilt dies für alle anderen Objekttypen, die eine explizite Bereinigung erfordern.

+1

+1, alle guten Punkte, die ich nicht erwähnen wollte. :) – FogleBird

+1

"nicht gestört" - ich wusste nichts davon. :( – bodacydo

+0

Danke für die Erwähnung all dieser wichtigen Punkte! – bodacydo

Verwandte Themen