我已阅读,使用下面的格式打开文件时,不需要文件打开和关闭在Python
with open(filename) as f:
#My Code
f.close()
文件的明确的结束。有人可以解释为什么这样吗?另外如果有人确实关闭了文件,会不会有不良影响?
我已阅读,使用下面的格式打开文件时,不需要文件打开和关闭在Python
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中,包装中的一个io
在Python 3)返回的对象中有这样的事情:
def __exit__(self):
self.close()
它实际上比上一个版本更复杂一些,这使得生成更好的错误消息变得更容易,并且让Python避免“进入”一个不知道如何去掉的块o“退出”。
要了解所有的细节,请阅读PEP 343。
此外,如果有人不明确地关闭文件,将它有什么不良影响?
一般来说,这是一件坏事。
但是,文件对象为了安全起见而不自主。对已关闭的文件执行任何操作都是错误的,除了close
。
*除非您在服务器上拉动电源线,以免执行脚本。在这种情况下,显然,它永远不会运行任何代码,更不用说close
。但明确的close
几乎不会帮助你。
不需要关闭,因为with
语句会自动处理该问题。
内with
声明open(...)
的__enter__
方法被调用,只要你出门该块的__exit__
方法被调用。
因此,手动关闭它是徒劳的,因为__exit__
方法将自动处理。
至于f.close()
之后,它没有错,但没用。它已经关闭,所以它不会做任何事情。
而且看到我这篇文章有关with
语句的更多信息:http://effbot.org/zone/python-with-statement.htm
http://effbot.org/zone/python-with-statement.htm – piokuc
我删除了标签''蟒蛇,2.7''因为with语句不是特定于此版本的Python。 with语句是在Python 2.5中引入的,因此是Python的基本特征。关于这个问题的博客网页是这样的:(http://preshing.com/20110920/the-python-with-statement-by-example/) – eyquem