2013-11-20 21 views
8

ho salvato un dizionario Python in questo modo (in realtà con "cPickle importazione come salamoia"):Come chiudere il file dopo pickle.load() in python

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

E che carico in un altro script in questo modo:

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

Come è possibile chiudere il file dopo questo?

risposta

22

E 'meglio utilizzare un with statement invece, che si chiude il file quando l'istruzione si conclude, anche se si verifica un'eccezione:

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

In caso contrario, il file sarà solo chiuso quando il garbage collector viene eseguito, e quando ciò accade è indeterminato e quasi impossibile da prevedere.

5

Utilizzare l'istruzione with è l'approccio migliore, ma solo per essere contrario, se non si utilizza with, è necessario mantenere un handle di file ... e chiudere da lì.

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

e nell'altra script:

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

Questo è essenzialmente ciò che with sta facendo per voi.

Tuttavia ... se si è bloccato (per qualsiasi motivo), con il codice originariamente inviato e per rispondere alla domanda originale ... sì, il garbage collector lo chiuderà per voi in un momento non specificato in futuro. Oppure è possibile rintracciare un riferimento all'oggetto file utilizzando il modulo gc, quindi chiuderlo. Ci sono alcuni codici di là fuori che potrebbero aiutare a fare questo, per esempio: https://github.com/uqfoundation/dill/blob/master/dill/pointers.py

Tuttavia, with e f.close() sono molto molto più preferita, e si dovrebbe evitare di tracciare attraverso il modulo gc se non si è veramente in una salamoia.

Problemi correlati