什么时候需要关闭文件,什么时候不在python中?

时间:2015-07-05 11:31:50

标签: python file

我试图编写以负责任的方式管理资源的代码。我知道确保文件在使用后关闭的常用习惯是

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

但是,我经常看到人们会做以下事情:

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

我想知道这是一种正确的方法,即使filename.pkl抛出异常,Python总是关闭cPickle吗?一些解释(或解释文章的指示)是否安全?

2 个答案:

答案 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 可能处理它,最好明确地执行此操作。