über eine Datei in Python zu schließen

7

Ich weiß, dass es eine gute Angewohnheit ist, eine Datei mit close zu schließen, wenn sie in Python nicht mehr verwendet wird. Ich habe versucht, eine große Anzahl geöffneter Dateien zu öffnen und sie nicht zu schließen (im selben Python-Prozess), sehe aber keine Ausnahmen oder Fehler. Ich habe sowohl Mac als auch Linux ausprobiert. Also, nur zu fragen, ob Python intelligent genug ist, Dateihandle zu verwalten, um sie automatisch zu schließen / wiederzuverwenden, so dass wir uns nicht um das Schließen der Datei kümmern müssen?

danke im voraus, Lin

    
Lin Ma 07.05.2015, 04:55
quelle

5 Antworten

19

Python wird im Allgemeinen Garbage Collect Objekte, die nicht mehr verwendet werden und nicht mehr referenziert werden. Dies bedeutet, dass offene Dateiobjekte, die mit den Filtern des Garbage Collectors übereinstimmen, möglicherweise bereinigt und wahrscheinlich geschlossen werden. Jedoch ; Sie sollten sich nicht darauf verlassen und stattdessen verwenden:

%Vor%

Beispiel ( Auch bewährte Methode ):

%Vor%

Hinweis: Wenn Sie die Datei nicht schließen und "offene Dateideskriptoren" auf Ihrem System belassen, werden Sie eventuell Ressourcenlimits auf Ihrem System treffen. speziell "ulimit". Sie werden eventuell anfangen, Betriebssystemfehler zu sehen, die mit "zu vielen offenen Dateien" zusammenhängen. ( Linux hier vorausgesetzt, aber andere Betriebssysteme haben ein ähnliches Verhalten ).

Wichtig: Es ist auch eine gute Praxis , alle offenen Dateien, die Sie geschrieben haben, zu schließen, damit die von Ihnen geschriebenen Daten ordnungsgemäß gelöscht werden. Dies hilft, die Datenintegrität zu gewährleisten und Dateien nicht unerwartet aufgrund eines Anwendungsabsturzes zu enthalten.

  

Es ist erwähnenswert, dass die obige wichtige Anmerkung die Ursache vieler Probleme mit dem Schreiben in eine Datei ist; lies es zurück; entdecke, dass es leer ist; aber schließe dann dein Python-Programm; lies es in einem Texteditor und stelle fest, dass es nicht leer ist.

Demo: Ein gutes Beispiel für die Art von Ressourcenbeschränkungen und -fehlern, die Sie treffen könnten, wenn Sie nicht sicherstellen, dass Sie geöffnete Dateien schließen:

%Vor%     
James Mills 07.05.2015, 05:00
quelle
5

Um die Antwort von James Mills hinzuzufügen, müssen Sie, wenn Sie den spezifischen Grund verstehen müssen, keine Fehler sehen :

Python definiert, dass wenn eine Datei mit Müll gesammelt wird, diese automatisch geschlossen wird. Aber Python überlässt es der Implementierung, wie es mit der Garbage-Collection umgehen will. CPython, die Implementierung, die Sie wahrscheinlich verwenden, macht es mit Referenzzählung: sobald der letzte Verweis auf ein Objekt verschwindet, wird es sofort gesammelt. All dies scheint in CPython zu funktionieren:

%Vor%

Aber viele andere Implementierungen (einschließlich der anderen großen drei, PyPy, Jython und IronPython) verwenden intelligentere Garbage Collectors, die Müll im laufenden Betrieb erkennen, ohne alle Verweise verfolgen zu müssen. Dies macht sie effizienter, besser beim Threading usw., aber es bedeutet, dass es nicht deterministisch ist, wenn ein Objekt gesammelt wird. Also wird der gleiche Code nicht funktionieren. Oder, schlimmer noch, es wird in Ihren 60 Tests funktionieren und dann scheitern, sobald Sie eine Demo für Ihre Investoren machen.

Es wäre eine Schande, wenn Sie die Geschwindigkeit von PyPy oder die .NET-Integration von IronPython benötigen würden, aber es wäre nicht möglich, ohne Ihren gesamten Code neu zu schreiben. Oder wenn jemand anders Ihren Code verwenden wollte, aber in Jython arbeiten musste und sich woanders umsehen musste.

In der Zwischenzeit sammelt der Interpreter selbst in CPython nicht den gesamten Müll beim Herunterfahren. (Es wird besser, aber selbst in 3.4 ist es nicht perfekt.) In einigen Fällen verlassen Sie sich also auf das Betriebssystem, um Ihre Dateien für Sie zu schließen. Das OS wird normalerweise spülen, wenn es das tut - aber vielleicht nicht, wenn Sie sie zum Beispiel in einem Daemon-Thread geöffnet haben oder Sie mit os._exit oder segfaulted beendet haben. (Und natürlich nicht, wenn Sie von jemandem, der über das Stromkabel stolpert, hinausgehen.)

Schlussendlich, sogar CPython (seit 3.3, glaube ich) hat Code, um Warnungen zu generieren, wenn Sie Ihre Dateien als Garbage Collected erhalten, anstatt sie zu schließen. Diese Warnungen sind standardmäßig deaktiviert, aber die Benutzer schlagen regelmäßig vor, sie einzuschalten, und eines Tages könnte es passieren.

    
abarnert 07.05.2015 06:02
quelle
3

Sie müssen Dateien in Python schließen (ausgeben).

Ein Beispiel dafür ist, den Ausgang auf sie zu spülen. Wenn Sie Dateien nicht ordnungsgemäß schließen und Ihr Programm aus irgendeinem Grund beendet wird, kann die Datei, die nach links geöffnet wurde, beschädigt werden.

Zusätzlich gibt es das: Warum Python Limit hat für die Anzahl der Dateigriffe?

    
GreenAsJade 07.05.2015 04:58
quelle
3

Es gibt zwei gute Gründe.

  1. Wenn Ihr Programm abstürzt oder unerwartet beendet wird, sind die Ausgabedateien möglicherweise beschädigt.
  2. Es ist eine gute Übung, zu schließen, was Sie öffnen.
John Percival Hackworth 07.05.2015 05:01
quelle
2

Es ist eine gute Idee, die Datei zu schließen. Es ist nicht die Art von Sache, die Fehler und Ausnahmen geben wird: Es wird Dateien beschädigt, oder nicht schreiben, was Sie versuchten zu schreiben, und so weiter.

Der gebräuchlichste Python-Interpreter, CPython, den Sie wahrscheinlich verwenden, tut , versucht jedoch, die Datei intelligent zu schließen, nur für den Fall, dass Sie dies nicht tun. Wenn du eine Datei öffnest und dann Müll sammelt, was normalerweise passiert, wenn es keine Referenzen mehr gibt, schließt CPython die Datei.

Also zum Beispiel, wenn Sie eine Funktion wie

haben %Vor%

Dann schließt Python die Datei im Allgemeinen zu irgendeinem Zeitpunkt, nachdem die Funktion zurückkehrt.

Das ist nicht so schlecht für einfache Situationen, aber bedenke das:

%Vor%

Jetzt haben Sie die Datei geöffnet, aber es könnte lange dauern, bis sie geschlossen wird. Bei einigen Betriebssystemen kann dies bedeuten, dass andere Prozesse es nicht öffnen können. Wenn das andere Zeugs einen Fehler aufweist, wird Ihre Nachricht möglicherweise nicht tatsächlich in der Datei geschrieben. Wenn Sie eine ganze Menge Zeug schreiben, könnte etwas davon geschrieben werden, und einige andere Teile könnten nicht; Wenn Sie eine Datei bearbeiten, können Sie alle möglichen Probleme verursachen. Und so weiter.

Eine interessante Frage ist jedoch, ob in Betriebssystemen, in denen Dateien zum Lesen durch mehrere Prozesse geöffnet sein können, ein erhebliches Risiko besteht, eine Datei zum Lesen zu öffnen und nicht zu schließen.

    
cge 07.05.2015 05:01
quelle

Tags und Links