In Bezug auf meine vorherige Frage habe ich festgestellt, dass in beiden Antworten, in denen die open()
Funktion verwendet wurde, das Schließen der Datei nicht erwähnt wurde.
Ich habe gelesen, dass es eine gute Praxis ist, dies zu tun, aber besteht tatsächlich ein Bedarf dafür? Ist es nur unnötiger Code?
Wird die Datei automatisch geschlossen?
with open (file_name, ...) as variable:
Ruft dieclose()
Methode automatisch auf , sobald Sie diesen Codeblock verlassen.python3
wird die Datei automatisch gelöscht, sobald keine Referenzen mehr vorhanden sind.Antworten:
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:
close()
Methode einesfile
Objekts manuell explizit oder implizit auf, indem Sie einenwith 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!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.quelle
python3
nicht mehr und die Antwort ist veraltet. Die automatische Speicherbereinigung existiert aus einem bestimmten Grund und funktioniert einwandfrei. Es ist Jahre her, seit ichclose()
speziell verwendet habe. Nie jemals lief in einen einzigen Fehler , verursacht durch nicht verwenden.