Ist das Schließen einer Datei nach dem Öffnen mit "open ()" in Python erforderlich? [geschlossen]

9

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?

Sag mir warum
quelle
1
with open (file_name, ...) as variable:Ruft die close()Methode automatisch auf , sobald Sie diesen Codeblock verlassen.
Byte Commander
1
Cross-Site-Duplikat von stackoverflow.com/q/7395542/4464570
Byte Commander
@ByteCommander Möchten Sie Ihren Kommentar als Antwort geben, um diese Frage "gelöst" zu machen?
TellMeWhy
1
In python3wird die Datei automatisch gelöscht, sobald keine Referenzen mehr vorhanden sind.
Jacob Vlijm
4
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da es sich um eine allgemeine Frage zu Python handelt, die keine Verbindung zu Skripten unter Ubuntu hat. Es wird nach Best Practices in einer Programmiersprache gefragt.
Terdon

Antworten:

9

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 fileObjekts manuell explizit oder implizit auf, indem Sie einen with open(...):Block verlassen. Dies funktioniert natürlich immer und bei jeder Python-Implementierung.
  • fileDie 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. ext4wenn 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.

Byte Commander
quelle
Nicht ganz wahr für Python3 !!
Jacob Vlijm
@JacobVlijm Würde es Ihnen etwas ausmachen, es zu erklären?
Byte Commander
Siehe den Kommentar unter der Frage. Die Antwort zu "nicht bewährte Verfahren" im Link Ihrer Antwort stammt aus dem Jahr 2011. Wenn sie jemals existiert hat, existiert die Warnung in python3nicht mehr und die Antwort ist veraltet. Die automatische Speicherbereinigung existiert aus einem bestimmten Grund und funktioniert einwandfrei. Es ist Jahre her, seit ich close()speziell verwendet habe. Nie jemals lief in einen einzigen Fehler , verursacht durch nicht verwenden.
Jacob Vlijm
Soo ... Sie wissen, ob die anderen Implementierungen wie PyPy, Jython oder IronPython Dateien auf die gleiche Weise schließen wie CPython? Und wenn ich den Dolmetscher töten würde, hätte er keine Chance, die Datei zu schließen, oder? Und ich denke auch, dass das Limit für offene Dateien immer noch gilt. Was ist mit dem Löschen geschriebener Daten? Sie wissen dort etwas aktuelleres?
Byte Commander
1
@JacobVlijm Danke für den Tipp. : P Mein Computer ist bereits beim Erstellen dieser Datei abgestürzt ... Ich brauchte dafür nicht einmal Python.
Byte Commander