Wann werden Dateien geschlossen?
Wie wir lernen können Ist es wichtig, Dateien explizit zu schließen? (StackOverflow) schließt der Python-Interpreter die Datei in den folgenden Fällen:
- Sie rufen die
close()
Methode eines file
Objekts manuell explizit oder implizit auf, indem Sie einen with open(...):
Block verlassen. Dies funktioniert natürlich immer und bei jeder Python-Implementierung.
file
Die letzte Referenz des Objekts wurde entfernt und daher wird das Objekt vom Garbage Collector verarbeitet. Dies ist keine Sprachfunktion, sondern nur eine Besonderheit der CPython-Implementierung. Verlassen Sie sich daher für die Portabilität nicht darauf!
- Der Python-Interpreter wird beendet. In diesem Fall sollten alle geöffneten Dateihandles geschlossen werden. Einige ältere Versionen von Python3 hätten auch eine Warnung gedruckt, dass Sie sie manuell selbst hätten schließen sollen. Stellen Sie sich jedoch einen Absturz vor oder Sie erzwingen den Python-Interpreter und Sie werden sehen, dass dies auch nicht zuverlässig ist.
Nur die erste (manuelle) Methode ist also zuverlässig!
Was würde passieren, wenn eine Datei geöffnet bleibt?
Erstens können Sie abhängig von der Implementierung Ihres Python-Interpreters beim Öffnen einer Datei mit Schreibzugriff nicht sicher sein, ob Ihre Änderungen auf die Festplatte übertragen wurden, bis Sie sie entweder manuell induzieren oder der Datei-Handler geschlossen wird.
Zweitens können Sie pro Benutzer nur eine begrenzte Anzahl von Dateien auf Ihrem System öffnen. Wenn Sie diese Grenze überschreiten, indem Sie beispielsweise viele Dateien in einer Schleife in Ihrem Python-Programm öffnen, ohne sie so schnell wie möglich zu schließen, weigert sich das System möglicherweise, weitere Dateihandles für Sie zu öffnen, und Sie erhalten eine Ausnahme. Es kann auch vorkommen, dass Ihr Programm die zuletzt zulässige geöffnete Datei verwendet und ein anderes Programm fehlschlägt, weil es abgelehnt wird.
Drittens verhindern geöffnete Dateien auf einem Wechseldatenträger, dass die Bereitstellung aufgehoben oder ausgeworfen wird. Sie können die Datei auf einigen Dateisystemen weiterhin löschen, z. B. ext4
wenn einfach der Dateideskriptor / die feste Verknüpfung zum Inode der Datei entfernt / nicht verbunden wird, das Programm, das die Datei geöffnet hat, jedoch weiterhin über seinen eigenen temporären Dateihandler auf den Inode zugreifen kann. Dies ist zB auch der Mechanismus, mit dem Sie Pakete aktualisieren können, während die jeweilige Software ausgeführt wird. Beispielsweise hat NTFS jedoch keine solche Funktion. Es kann jedoch niemals durch zwei gleichzeitige Prozesse geändert werden, so dass es für andere immer noch irgendwie blockiert wird.
with open (file_name, ...) as variable:
Ruft dieclose()
Methode automatisch auf , sobald Sie diesen Codeblock verlassen.