我已经读过,当使用以下格式打开文件时
with open(filename) as f:
#My Code
f.close()
不需要显式关闭文件。有人可以解释为什么会这样吗?此外,如果有人明确关闭文件,它会产生任何不良影响吗?
我已经读过,当使用以下格式打开文件时
with open(filename) as f:
#My Code
f.close()
不需要显式关闭文件。有人可以解释为什么会这样吗?此外,如果有人明确关闭文件,它会产生任何不良影响吗?
最重要的概述是这样的:当您离开嵌套块时,Python 会自动f.close()
为您调用。
不管你是从底部掉下来离开,还是调用break
//跳出来,或者引发异常continue
;return
不管你如何离开那个街区。它总是知道你要离开,所以它总是关闭文件。*
再往下一层,你可以把它想象成映射到try:
/finally:
语句:
f = open(filename)
try:
# My Code
finally:
f.close()
下一层:它怎么知道调用close
而不是不同的东西?
嗯,它不是真的。它实际上调用特殊方法__enter__
和__exit__
:
f = open()
f.__enter__()
try:
# My Code
finally:
f.__exit__()
并且由open
(file
Python 2 中的 a,Python 3 中的包装器之一io
)返回的对象中包含以下内容:
def __exit__(self):
self.close()
它实际上比上一个版本要复杂一些,这使得生成更好的错误消息变得更容易,并让 Python 避免“进入”它不知道如何“退出”的块。
要了解所有细节,请阅读PEP 343。
此外,如果有人明确关闭文件,它会产生任何不良影响吗?
一般来说,这是一件坏事。
但是,文件对象会竭尽全力确保其安全。对已关闭的文件执行任何操作都是错误的——除非close
再次对其执行。
* 除非你离开,比如说,在执行脚本的过程中拔掉服务器上的电源线。在那种情况下,很明显,它永远不会运行任何代码,更不用说close
. 但是一个明确的close
几乎不会帮助你。
不需要关闭,因为with
语句会自动处理。
在with
语句中,__enter__
方法 onopen(...)
被调用,一旦你离开该块,__exit__
方法就会被调用。
所以手动关闭它是徒劳的,因为该__exit__
方法会自动处理它。
至于f.close()
后面,没有错,但没用。它已经关闭,所以它不会做任何事情。
with
另请参阅此博客文章以获取有关该声明的更多信息:http: //effbot.org/zone/python-with-statement.htm