我读过当使用以下格式打开文件时
with open(filename) as f:
#My Code
f.close()
不需要明确关闭文件。有人可以解释为什么会这样吗?另外,如果有人明确关闭文件,是否会产生不良影响?
最佳答案
最重要的概述是这样的:当您离开嵌套 block 时,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
返回的对象(Python 2 中的 file
,Python 3 中 io
的包装器之一)有类似里面有这个:
def __exit__(self):
self.close()
它实际上比上一个版本更复杂一些,这使得生成更好的错误消息变得更容易,并且让 Python 避免“进入”一个它不知道如何“退出”的 block 。
要了解所有详细信息,请阅读 PEP 343 .
Also if someone does explicitly close the file, will it have any undesirable effect ?
一般来说,这是一件坏事。
但是,文件对象竭尽全力确保其安全。对已关闭的文件执行任何操作都是错误的——除非再次关闭
它。
* 除非你离开,比如说,在服务器执行脚本的过程中拔下服务器的电源线。在那种情况下,显然,它永远不会运行任何 代码,更不用说关闭
了。但是显式的 close
几乎帮不了你。
关于python - 在python中打开和关闭文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459867/