我试图编写以负责任的方式管理资源的代码。我知道确保文件在使用后关闭的常用习惯是
with open("filename.txt", 'r') as f:
# ...use file `f`...
但是,我经常看到人们会做以下事情:
data = cPickle.load(open("filename.pkl", 'r'))
我想知道这是一种正确的方法,即使filename.pkl
抛出异常,Python总是关闭cPickle
吗?一些解释(或解释文章的指示)是否安全?
答案 0 :(得分:3)
当你打开文件时,Python不会关闭文件。当你在下面的代码中传递它时,不用with
语句包装脚本:
data = cPickle.load(open("filename.pkl", 'r'))
您需要手动关闭。
这是关于pickle
模块的示例表单python文档:
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()
正如您所见,文件已在代码末尾关闭!
另外,有关更多信息,请阅读以下有关关闭文件的python文档:
完成文件后,请调用
f.close()
关闭文件并释放打开文件占用的所有系统资源。调用f.close()
后,尝试使用文件对象将自动失败。
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
在处理文件对象时,最好使用with关键字。这样做的好处是,即使在路上引发异常,文件也会在套件完成后正确关闭。它也比编写等效的try-finally块短得多:
>>>
>>> with open('workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
答案 1 :(得分:0)
您可以看到documentation here
如果你使用类似的东西:
f = open('filename', 'r')
...
# Always close
f.close()
或者,像这样:
with open('workfile', 'r') as f:
read_data = f.read()
f.closed # True
您还可以使用finally, which is made for resource cleanup:
try:
f = open('filename', 'r')
finally:
if f and not f.closed:
f.close()
在您的示例中,应该关闭该文件,即使GC 可能处理它,最好明确地执行此操作。