2017-07-15 4 views
-1

Die Standardantwort auf "wie kann ich sicherstellen, dass eine Datei in Python geschlossen ist" besteht darin, die Befehle in eine "mit" -Anweisung zu verpacken Der Destruktor wird beim Verlassen des "mit" -Blocks aufgerufen.in Python, stellen Sie sicher, dass eine Datei geschlossen ist, wenn Sie nicht "mit" verwenden können

Aber was ist mit einem Fall, wo Sie das nicht tun können, weil das Datei-Handle über einen großen Schwaden von Code geöffnet bleiben muss? Beispielsweise öffnen Sie das Dateihandle in einem Objektkonstruktor, speichern es in einer Objekteigenschaft und verweisen dann in vielen Objektmethoden auf das Dateihandle.

Es wäre möglich, die Öffnung des Datei-Handle auf die Methoden selbst zu verschieben, aber grundsätzlich würde ich in diesem Fall die Datei öffnen/schließen, wenn eine Methode aufgerufen wird, was weit weniger effizient ist.

Ich habe versucht, einen "close" -Befehl in den Objektdestruktor (die "del" -Methode), aber das funktioniert nicht.

+0

Warum funktioniert das Schließen der Datei im Destruktor nicht? Wird das Objekt nicht zerstört, wenn Sie damit fertig sind? Wenn es bei Fehlern scheitert und in der Nähe bleibt, können Sie es in einen 'try'-' except'-'finally'-Block einfügen. – JohanL

+0

Ich beende das Programm, indem ich den Kernel kill (d. H. Ich habe die große Stopp-Taste in Spyder gedrückt). Ich bin mir nicht sicher, was in diesem Fall ausgeführt wird, wenn überhaupt. – Stephen

+0

versuchen/except/schließlich wird wahrscheinlich nicht funktionieren, denn wieder, der "open" -Befehl ist im Konstruktor, aber dann das Programm bewegt sich und beginnt mit anderen Methoden schreiben – Stephen

Antwort

0

Ein schmutziger, aber einfacher Gewinn besteht darin, die Dateinamen beim Öffnen zu speichern und sicherzustellen, dass file.close(...) am Ende erscheint. Halten Sie eine Liste oder Umhüllung der open() Funktion (vorschlagen durch this post) kann die Arbeit tun.

Post check what files are open in Python schlägt mehrere Lösungen wie Wrapping das integrierte Dateiobjekt, Befehlszeilenmethode und Modul psutil, etc, vielleicht einige von ihnen würde in Ihre Situationen passen.

Verwandte Themen