Ausdrücklich schließen von Dateien wichtig?
In Python, wenn Sie entweder eine Datei öffnen, ohne close()
oder schließen Sie die Datei, nicht aber mit try
-finally
oder die " with
" - Anweisung, ist das ein problem? Oder hat es genügt als eine Codierung, die Praxis zu verlassen, auf dem Python garbage-collection zu schließen, alle Dateien? Zum Beispiel, wenn man das tut:
for line in open("filename"):
# ... do stuff ...
... ist das ein problem, da die Datei kann nicht verschlossen werden und eine Ausnahme auftreten könnte, verhindert, dass Sie geschlossen? Oder wird es definitiv geschlossen werden die bei Abschluss des for
Aussage, weil die Datei außerhalb des Gültigkeitsbereichs?
Die Datei ist nicht go-out-of-scope am Ende der
Es ist nicht ein problem, es sei denn, es ist ein problem. Auf OS-Ebene, können alle Dateien geöffnet, indem das Skript wird geschlossen, wenn das Skript beendet, so müssen Sie sich keine sorgen über die Schließung Dateien in Wegwerf Scripte. Jedoch, Prozesse haben ein limit für die Anzahl offener Dateien, die Sie pflegen können, so lange gelebt oder komplexe Skripte können müssen vorsichtiger sein. In jedem Fall, es ist eine gute Angewohnheit, um zu schließen Sie Ihre Dateien.
Sie sind richtig, dass die Datei nicht mehr gültig sind, aber nicht im Zusammenhang mit der Unterscheidung zwischen
Mein Kommentar ist korrigiert seine Annahme, dass es einen Bereich im Zusammenhang mit der
es gibt eine implizite Referenz den Gültigkeitsbereich, die for-Schleife... das ist ein argument der Semantik
for
block. Dessen Referenzzähler wird auf null gesetzt, wodurch es zu automatisch geschlossen werden, sondern nur Funktionen, Klassen und Module definieren von Bereichen in Python, nicht andere zusammengesetzte Aussagen.Es ist nicht ein problem, es sei denn, es ist ein problem. Auf OS-Ebene, können alle Dateien geöffnet, indem das Skript wird geschlossen, wenn das Skript beendet, so müssen Sie sich keine sorgen über die Schließung Dateien in Wegwerf Scripte. Jedoch, Prozesse haben ein limit für die Anzahl offener Dateien, die Sie pflegen können, so lange gelebt oder komplexe Skripte können müssen vorsichtiger sein. In jedem Fall, es ist eine gute Angewohnheit, um zu schließen Sie Ihre Dateien.
Sie sind richtig, dass die Datei nicht mehr gültig sind, aber nicht im Zusammenhang mit der Unterscheidung zwischen
for
Blöcke und Funktionen/Klassen/Module. Es ist viel einfacher als das: Objekte nicht über Bereiche, nur Namen tun. Es gibt keinen Namen, bezieht sich auf dieses Objekt, es gibt also nichts, hier zu bleiben im Bereich oder außerhalb des Bereichs.Mein Kommentar ist korrigiert seine Annahme, dass es einen Bereich im Zusammenhang mit der
for
Schleife, und der Erwähnung, dass die Datei geschlossen wird, für einen ganz anderen Grund. Es nicht in welche Bereiche sind in Python, da es hier nicht relevant.es gibt eine implizite Referenz den Gültigkeitsbereich, die for-Schleife... das ist ein argument der Semantik
InformationsquelleAutor user553702 | 2011-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
In deinem Beispiel die Datei nicht garantiert werden geschlossen, bevor der interpreter beendet wird. In den aktuellen Versionen von CPython wird die Datei geschlossen am Ende der for-Schleife, weil CPython benutzt reference counting als seine primäre Mechanismus zur garbage collection, aber das ist ein Implementierungsdetail, nicht ein Merkmal der Sprache. Andere Implementierungen von Python nicht garantiert auf diese Weise zu arbeiten. Z.B. IronPython, PyPy und Jython nicht verwenden Referenz zählen und daher nicht schließen Sie die Datei an das Ende der Schleife.
Es ist schlechte Praxis, auf die Sie sich verlassen CPython ist die garbage-collection-Implementierung, da es macht den code weniger tragbar. Sie haben eventuell keine Ressourcen-Lecks, wenn Sie CPython, aber wenn du mal wechseln, um eine Python-Implementierung, die nicht mit Referenz-Zählung, die Sie brauchen, um durch alle Ihre code und stellen Sie sicher, dass alle Dateien ordnungsgemäß geschlossen werden.
Für dein Beispiel zu verwenden:
with open() as f
automatisch schließen Sie die Datei, nachdem es fertig ist?ja, das ist die kleine Magie, die
with
Erklärung bieten, aber natürlich auch für diese Magie zu arbeiten, muss dem Objekt das Besondere Methoden__enter__
und__exit__
im letzteren Fall wird das Objekt tun, dieclose
und andere cleanup Sachen, die getan werden müssen am Ende derwith
Aussage...FYI: Diese Antwort wird nur erläutert, "wenn es geschlossen werden würde", aber nicht "erklären" was, wenn es geöffnet bleibt". Für letzteres, bitte Lesen Sie die "Was würde passieren, wenn eine Datei geöffnet bleibt?" Teil, die in dieser Antwort (askubuntu.com/questions/701491/...)
Außerdem, nicht schließen von Dateien führen kann abgeschnitten werden Dateien als Inhalt der Datei nicht geleert wurde.
So, wenn ich nicht schließen Sie die Datei, bekomme ich mein Speicher wieder für sicher, dass sobald das Programm beendet wird? Oder muss ich wirklich haben, um zu beenden aus der ganzen Dolmetscher?
InformationsquelleAutor Peter Graham
Einige Pythons schließen von Dateien automatisch, wenn Sie nicht mehr referenziert wird, während andere nicht, und es ist bis auf die O/S schließen von Dateien, wenn der Python-interpreter beendet wird.
Sogar für die Pythons, die dem schließen von Dateien für Sie, das timing ist nicht garantiert: es könnte sein, sofort, oder es könnte sein, Sekunden/Minuten/Stunden/Tage später.
So, während Sie kann keine Probleme mit der Python, die Sie verwenden, es ist definitiv nicht eine gute Praxis, um Ihre Dateien zu öffnen. In der Tat, in cpython 3 nun bekommen Sie Warnungen, die das system hatte, um Dateien für Sie, wenn Sie es nicht getan hat.
Moral: nach sich selbst Bereinigen. 🙂
InformationsquelleAutor Ethan Furman
Obwohl es ziemlich sicher ist zu verwenden, so bauen in diesem speziellen Fall, es gibt einige Einschränkungen für eine Verallgemeinerung einer solchen Praxis:
InformationsquelleAutor Dima Tisnek
Die Datei bekommen hat Müll gesammelt, und daher geschlossen. Der GC bestimmt, wenn es geschlossen wird, nicht Sie. Offensichtlich, dies ist nicht eine empfohlene Praxis, weil Sie möglicherweise klicken Sie auf " öffnen Datei-handle zu begrenzen, wenn Sie nicht schließen Sie die Dateien, sobald Sie fertig sind mit Ihnen. Was, wenn innerhalb dieser
for
loop von Ihnen, Sie mehrere Dateien öffnen, und lassen Sie Sie Verweilen?In CPython, reference counting wird es gesammelt nach der
for
Anweisung-Sie müssen nicht warten, bis die nächste garbage collection ausgeführt werden.InformationsquelleAutor Nam Nguyen
Hallo Es ist sehr wichtig, um in der Nähe Ihrer Datei-Deskriptor in der situation, wenn Sie es benutzen werden die Inhalte in der gleichen python-Skript. Ich habe heute selbst verwirklichen, nach so langer hecting Debuggen. Der Grund ist Inhalt werden editiert/entfernt/nur gespeichert, nachdem Sie schließen Sie Datei-Deskriptor und änderungen betroffen-Datei!
Also angenommen, Sie haben die situation, dass Sie schreiben, Inhalt in eine neue Datei und dann ohne schließen der fd, die Sie verwenden, die Datei(nicht fd) in einem anderen shell-Befehl liest den Inhalt. In dieser situation werden Sie nicht bekommen, Sie Inhalte für shell-Befehl als erwartet, und wenn Sie versuchen zu Debuggen, die Sie nicht finden können, den Fehler einfach. Sie können auch Lesen Sie mehr in meinem blog-Eintrag http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html
InformationsquelleAutor Zeel Shah
Während der I/O-Prozess -, Daten gepuffert ist: das bedeutet, dass es gehalten wird, in einem temporären Speicherort, bevor Sie in die Datei geschrieben.
Python nicht der Puffer geleert—das schreiben von Daten zu der Datei—bis es Sie sicher, dass Sie fertig sind schreiben. Ein Weg dies zu tun ist, die Datei zu schließen.
Wenn Sie in eine Datei schreiben, ohne zu schließen, die Daten werden nicht in die Zieldatei.
InformationsquelleAutor Sanket Nagrale