Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候需要关闭文件,什么时候不在python中?_Python_File - Fatal编程技术网

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

什么时候需要关闭文件,什么时候不在python中?,python,file,Python,File,我试图编写以负责任的方式管理资源的代码。我知道,确保文件在使用后关闭的一个常见习惯用法是 with open("filename.txt", 'r') as f: # ...use file `f`... 然而,我经常看到人们这样做: data = cPickle.load(open("filename.pkl", 'r')) 我想知道这是一种正确的方法,Python是否总是关闭filename.pkl,即使cPickle抛出异常?一些解释(或指向解释这是否安全的文章的指针?您可以看

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

with open("filename.txt", 'r') as f:
    # ...use file `f`...
然而,我经常看到人们这样做:

data = cPickle.load(open("filename.pkl", 'r'))
我想知道这是一种正确的方法,Python是否总是关闭
filename.pkl
,即使
cPickle
抛出异常?一些解释(或指向解释这是否安全的文章的指针?

您可以看到

如果您使用以下内容:

f = open('filename', 'r')
...
# Always close
f.close()
或者,像这样:

with open('workfile', 'r') as f:
    read_data = f.read()
f.closed # True
您还可以使用:


在您的示例中,应该关闭该文件,即使GC可能会处理它,但最好显式地这样做

Python不会自动为您关闭文件,因为它不知道您何时处理完file对象。您需要显式关闭文件或将代码(其中包含
open(…)
函数)包装到
with
语句中。下面是一个关于
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风格的方法,您可以:

with open("filename.pkl", 'r') as f:
    data = cPickle.load(f)

是的,一旦文件对象被垃圾收集,它就会被关闭。
cPickle
是否引发异常并不重要。但由于我们无法控制何时会发生这种情况,因此这确实是一种不好的做法,即坚持使用
with open("filename.pkl", 'r') as f:
    data = cPickle.load(f)