文件在python中打开和关闭

时间:2013-07-03 23:45:20

标签: python file with-statement contextmanager

我已经读过使用以下格式打开文件

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

不需要显式关闭文件。有人可以解释为什么会这样吗?此外,如果某人明确关闭了该文件,它会产生任何不良影响吗?

2 个答案:

答案 0 :(得分:15)

英里高概述是这样的:当您离开嵌套块时,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避免“进入”一个它不知道如何“退出”的块。

要了解所有细节,请阅读PEP 343


  

此外,如果有人明确关闭了该文件,它会产生任何不良影响吗?

一般来说,这是一件坏事。

然而,文件对象不遗余力地使其安全。对封闭文件执行任何操作都是错误的 - 除了再次close之外。


*除非您离开,例如,在执行脚本的过程中拉动服务器上的电源线。在这种情况下,显然,它永远不会运行任何代码,更不用说close了。但明确的close对你来说几乎没有帮助。

答案 1 :(得分:3)

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

with语句中调用__enter__上的open(...)方法,一旦您离开该块,就会调用__exit__方法。

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

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

另请参阅此博客帖子,了解有关with声明的更多信息:http://effbot.org/zone/python-with-statement.htm