Ist das explizite Schließen von Dateien wichtig?

Wenn Sie in Python entweder eine Datei ohne Aufruf von close() öffnen oder die Datei schließen, aber nicht tryfinally oder die statement ” with ” verwenden, ist das ein Problem? Oder reicht es als Programmierpraxis, sich auf die Python-Müllsammlung zu verlassen, um alle Dateien zu schließen? Zum Beispiel, wenn man das macht:

 for line in open("filename"): # ... do stuff ... 

… ist das ein Problem, weil die Datei niemals geschlossen werden kann und eine Ausnahme auftreten kann, die verhindert, dass sie geschlossen wird? Oder wird es definitiv am Ende der for statement geschlossen, weil die Datei nicht mehr gültig ist?

In Ihrem Beispiel wird nicht garantiert, dass die Datei geschlossen wird, bevor der Interpreter beendet wird. In aktuellen Versionen von CPython wird die Datei am Ende der for-Schleife geschlossen, weil CPython die Referenzzählung als primären Speicherbereinigungsmechanismus verwendet, aber das ist ein Implementierungsdetail, kein Merkmal der Sprache. Andere Implementierungen von Python funktionieren nicht garantiert auf diese Weise. Zum Beispiel verwenden IronPython, PyPy und Jython keine Referenzzählung und schließen die Datei daher nicht am Ende der Schleife.

Es ist eine schlechte Praxis, sich auf die Garbage-Collection-Implementierung von CPython zu verlassen, da sie Ihren Code weniger portabel macht. Wenn Sie CPython verwenden, haben Sie möglicherweise keine Ressourcenverluste. Wenn Sie jedoch zu einer Python-Implementierung wechseln, die keine Referenzzählung verwendet, müssen Sie den gesamten Code durchgehen und sicherstellen, dass alle Dateien ordnungsgemäß geschlossen werden.

Für Ihr Beispiel verwenden Sie:

 with open("filename") as f: for line in f: # ... do stuff ... 

Einige Pythons schließen Dateien automatisch, wenn sie nicht mehr referenziert werden, während andere dies nicht tun und es dem O / S obliegt, Dateien zu schließen, wenn der Python-Interpreter beendet wird.

Selbst für die Pythons, die Dateien für Sie schließen, ist das Timing nicht garantiert: Es könnte sofort sein, oder es könnten Sekunden / Minuten / Stunden / Tage später sein.

Auch wenn Sie keine Probleme mit dem von Ihnen verwendeten Python haben, ist es sicherlich keine gute Übung, Ihre Dateien offen zu lassen. In cpython 3 erhalten Sie jetzt Warnungen, dass das System Dateien für Sie schließen musste, wenn Sie es nicht getan haben.

Moral: Aufräumen nach dir selbst. 🙂

Obwohl es in diesem speziellen Fall recht sicher ist, ein solches Konstrukt zu verwenden, gibt es einige Vorbehalte, um diese Praxis zu verallgemeinern:

  • run kann möglicherweise keine Dateideskriptoren mehr haben, obwohl es unwahrscheinlich ist, stellen Sie sich einen solchen Fehler vor
  • Sie sind möglicherweise nicht in der Lage, diese Datei auf einigen Systemen zu löschen, zB win32
  • Wenn Sie etwas anderes als CPython ausführen, wissen Sie nicht, wann die Datei für Sie geschlossen ist
  • Wenn Sie die Datei im Schreib- oder Lese-Schreib-Modus öffnen, wissen Sie nicht, wann Daten gelöscht werden

Die Datei wird Müll gesammelt und daher geschlossen. Der GC bestimmt, wann es geschlossen wird, nicht Sie. Offensichtlich ist dies keine empfohlene Vorgehensweise, da Sie möglicherweise das Limit für offene Dateizugriffe erreichen, wenn Sie Dateien nicht sofort schließen, wenn Sie sie nicht mehr verwenden. Was ist, wenn Sie innerhalb dieser for Schleife weitere Dateien öffnen und sie bleiben lassen?

Hi Es ist sehr wichtig, den Dateideskriptor in Situationen zu schließen, in denen Sie den Inhalt desselben Python-Skripts verwenden möchten. Heute erkenne ich selbst nach so langer Zeit Debugging. Der Grund dafür ist, dass der Inhalt erst bearbeitet / entfernt / gespeichert wird, nachdem Sie den Dateideskriptor geschlossen haben und Änderungen an der Datei vorgenommen werden!

Nehmen wir an, Sie haben eine Situation, in der Sie Inhalt in eine neue Datei schreiben und dann, ohne fd zu schließen, verwenden Sie diese Datei (nicht fd) in einem anderen Shell-Befehl, der seinen Inhalt liest. In dieser Situation werden Sie den Inhalt des Shell-Befehls nicht wie erwartet erhalten und wenn Sie versuchen zu debuggen, können Sie den Fehler nicht leicht finden. Sie können auch mehr in meinem Blog-Eintrag http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html lesen