2013-07-03 43 views
4

我已阅读,使用下面的格式打开文件时,不需要文件打开和关闭在Python

with open(filename) as f: 
     #My Code 
f.close() 

文件的明确的结束。有人可以解释为什么这样吗?另外如果有人确实关闭了文件,会不会有不良影响?

+0

http://effbot.org/zone/python-with-statement.htm – piokuc

+0

我删除了标签''蟒蛇,2.7''因为with语句不是特定于此版本的Python。 with语句是在Python 2.5中引入的,因此是Python的基本特征。关于这个问题的博客网页是这样的:(http://preshing.com/20110920/the-python-with-statement-by-example/) – eyquem

回答

11

英里高的概述是这样的:当你离开嵌套块时,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几乎不会帮助你。

3

不需要关闭,因为with语句会自动处理该问题。

with声明open(...)__enter__方法被调用,只要你出门该块的__exit__方法被调用。

因此,手动关闭它是徒劳的,因为__exit__方法将自动处理。

至于f.close()之后,它没有错,但没用。它已经关闭,所以它不会做任何事情。

而且看到我这篇文章有关with语句的更多信息:http://effbot.org/zone/python-with-statement.htm