2013-11-20 4 views
8

Ich sparte einen Python-Wörterbuch auf diese Weise (eigentlich mit "Import cPickle als Gurke") schließen:Wie die Datei nach pickle.load() in Python

pickle.dump (dictname, offen ("filename.pkl", "wb"))

Und ich es auf diese Weise in einem anderen Skript laden:

dictname = pickle.load (open ("filename.pkl", "rb"))

Wie ist es möglich, die Datei danach zu schließen?

Antwort

22

Es ist besser, ein with statement stattdessen zu verwenden, die die Datei schließt, wenn die Anweisung beendet, auch wenn eine Ausnahme auftritt:

with open("filename.pkl", "wb") as f: 
    pickle.dump(dictname, f) 
... 
with open("filename.pkl", "rb") as f: 
    dictname = pickle.load(f) 

Andernfalls wird die Datei nur dann geschlossen werden, wenn der Garbage Collector läuft, und wenn das ist unbestimmt und fast unmöglich vorherzusagen.

5

Verwenden Sie die with Anweisung ist der bessere Ansatz, aber nur um im Gegensatz zu sein, wenn Sie with nicht verwendet haben, sollten Sie eine Datei behandeln ... und schließen von dort.

f = open('filename.pkl', 'wb') 
pickle.dump(dictname, f) 
f.close() 

und in dem anderen Skript:

f = open('filename.pkl','rb') 
dictname = pickle.load(f) 
f.close() 

Dies ist im Wesentlichen, was with für Sie tut.

Jedoch ... wenn Sie (aus welchem ​​Grund auch immer) stecken geblieben sind, mit dem Code, den Sie ursprünglich gepostet haben, und um Ihre ursprüngliche Frage zu beantworten ... ja, der Müllsammler wird es für Sie zu einem unbestimmten Zeitpunkt in der Zukunft schließen. Oder Sie könnten einen Verweis auf das Dateiobjekt mit dem Modul gc aufspüren und dann schließen. Es gibt ein paar Codes gibt, die Sie tun dies helfen könnte, zum Beispiel: https://github.com/uqfoundation/dill/blob/master/dill/pointers.py

jedoch with und f.close() sind viel viel mehr bevorzugt, und Sie sollten Verfolgung durch das gc Modul vermeiden, wenn Sie wirklich in eine Gurke sind.

Verwandte Themen