2015-07-05 3 views
5

Stavo cercando di scrivere codice che gestisca le risorse in modo responsabile. Capisco che un idioma comune per assicurarsi che un file viene chiuso dopo l'uso èQuando è necessario chiudere un file e quando non è in python?

with open("filename.txt", 'r') as f: 
    # ...use file `f`... 

Tuttavia, vedo spesso le persone effettuare le seguenti operazioni:

data = cPickle.load(open("filename.pkl", 'r')) 

mi chiedo è che un modo giusto e fa Python chiude sempre filename.pkl anche se cPickle genera un'eccezione? Qualche spiegazione (o puntatori agli articoli che spiega) se questo è sicuro?

+1

Sì, l'oggetto file saranno chiuse una volta che è garbage collection. Non importa se 'cPickle' genera un'eccezione o meno. Ma dal momento che non abbiamo il controllo su quando accadrà, è davvero una cattiva pratica, cioè attaccare con 'with'. – freakish

risposta

3

Python non chiude il file quando si apre it.thus quando si passa nel codice seguente, senza avvolgendo lo script with dichiarazione:

data = cPickle.load(open("filename.pkl", 'r')) 

È necessario chiudere manualmente se.

Questo è un esempio di documentazione modulo python su pickle modulo:

import pprint, pickle 

pkl_file = open('data.pkl', 'rb') 

data1 = pickle.load(pkl_file) 
pprint.pprint(data1) 

data2 = pickle.load(pkl_file) 
pprint.pprint(data2) 

pkl_file.close() 

Come si può vedere il file è stato chiuso alla fine del codice!

anche per maggiori informazioni leggete la seguente documentazione pitone di chiudere un file:

Quando hai finito con un file, chiamata f.close() per chiuderla e liberare tutte le risorse di sistema prese dal aperta file. Dopo aver chiamato f.close(), i tentativi di utilizzare l'oggetto file falliranno automaticamente.

>>> f.close() 
>>> f.read() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
ValueError: I/O operation on closed file 

E 'buona norma utilizzare la parola chiave con quando si tratta di oggetti file. Ciò ha il vantaggio che il file viene chiuso correttamente al termine della sua suite, anche se viene sollevata un'eccezione durante il percorso. E 'anche molto più breve rispetto alla scrittura equivalenti try-finally blocchi:

>>> 
>>> with open('workfile', 'r') as f: 
...  read_data = f.read() 
>>> f.closed 
True 
0

Potete vedere il documentation here

Se si usa qualcosa come:

f = open('filename', 'r') 
... 
# Always close 
f.close() 

O, in questo modo:

with open('workfile', 'r') as f: 
    read_data = f.read() 
f.closed # True 

È inoltre possibile utilizzare finally, which is made for resource cleanup:

try: 
    f = open('filename', 'r') 
finally: 
    if f and not f.closed: 
      f.close() 

Nell'esempio, il file deve essere chiuso, anche se GC potrebbe essere gestito da, è meglio farlo esplicitamente.