2015-07-05 31 views
5

Kaynakları yöneterek sorumlu bir şekilde yönetmeye çalışıyordum. Merak ediyorumBir dosyayı kapatmak ve python olmadığında ne zaman gereklidir?

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

olduğunu doğru bir yolu ve yapar: Ben sık sık insanların aşağıdakileri yapın bakın ortak bir deyim, bir dosya kullandıktan sonra kapalı olduğundan emin Ancak

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

yapmak için anlamak Python, cPickle bir istisna atarsa ​​bile filename.pkl'u her zaman kapatır? Güvenli olup olmadığını (veya açıklayan makalelere işaretçiler) bazı açıklamalar?

+1

Evet, dosya nesnesi kapatılacaktır. CPickle'ın istisna mı atıp atmadığı fark etmez. Ancak, bunun ne zaman gerçekleşeceğine dair kontrolümüz olmadığından, gerçekten kötü bir uygulama, yani 'with' ile sopa. – freakish

cevap

3

Python sen it.thus açmak dosyayı kapatmaz.

Bu bir örnek form piton belgeleri yaklaşık pickle modülü:

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() 

dosya kodunun sonuna kapatıldı görebileceğiniz gibi! Eğer bir dosya ile bittiğinde

, kapatmak için f.close() arayıp kadar ücretsiz herhangi bir sistem kaynaklarını açık kapladığı: Ayrıca bir dosyayı kapatma hakkında aşağıdaki piton belgelerini okuyun daha fazla bilgi için

dosya. f.close() numaralı telefonu aradıktan sonra, dosya nesnesini kullanmaya yönelik girişimler otomatik olarak başarısız olur.

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

dosya nesneleri ile uğraşırken anahtar kelime ile kullanmak iyi bir uygulamadır. Bu, bir istisna kaldırılmış olsa bile, dosyanın tamamlanmasından sonra dosyanın uygun şekilde kapatılması avantajına sahiptir. Aynı zamanda eşdeğer try-nihayet blokları yazma çok daha kısadır: çöp toplanan bir kez

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

gibi bir şey kullanırsanız Sen documentation here

görebilirsiniz: Bu gibi

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

Veya:

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

da kullanabilirsiniz finally, which is made for resource cleanup:

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

Örneğinizde, dosya kapatılmalıdır, ancak GC ,'un ele alınmasına rağmen, bunu açıkça yapmak daha iyidir.

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

elle eğer kapatmak gerekir: with deyimi ile senaryoyu sarmadan kod aşağıdaki bunu geçerken

İlgili konular