2012-07-27 119 views
4

我常常不读它阅读后没有关闭文件有什么缺点吗?

for line in open(FileName): 
    # do something 

我也以同样的程序再次重新打开该文件后,关闭文件。

for line in open(FileName): 
    # do something else 

我的问题是这种方法是否有任何缺点? 我已经看到,声称文件应该是开放与with

with open(FileName) as fp: 

但职位是什么这种方法的优势在哪里?

回答

4

在某些情况下,您可能会在没有遇到不利影响的情况下关闭文件。当使用for line in open("filename"):时,CPython(最流行的Python实现)将在循环之后立即关闭文件,前提是不存在对文件的进一步引用。在其他Python实现中,关闭文件可能会延迟,但最终会被关闭。

有几个问题,虽然:

  1. 到一个文件中有时隐藏引用继续存在。如果在函数中抛出异常,与异常相关的回溯包含对函数执行fram的引用,所以所有局部变量都会继续存在 - 这可能会使文件在CPython中的打开时间超过预期。

  2. 打开许多文件时,您可能会耗尽文件描述符,因为您无法控制它们再次关闭的时间。

  3. 对于没有关闭的每个文件,Python 3.2或更高版本都会产生ResourceWarning(但可以禁用此警告)。

总之,这根本不值得麻烦。总是使用with,并忘记这些问题。无论如何,在琢磨时还是要记住。

+1

谢谢。我最喜欢你的最后一行。 – imsc 2012-07-27 11:21:58

+0

重发#1:在异常期间,受到'with'语句保护的开放文件,局部变量,堆栈帧中会发生什么? – thebjorn 2012-07-27 11:47:31

+0

@thebjorn:在堆栈展开期间,在执行'with'块的任何异常处理程序* outside *之前,它会被关闭。 – 2012-07-27 11:49:09

0

重新使用with

开放的主要优势/使用with管理文件的是,他们是在退出“块”与with assocated 自动关闭你。如果遇到例外,该文件也会关闭。

离开文件未关闭是不整洁的编程。

注意,尤其是在文件的情况下,你是来,你可能不会得到所有自动发生在你的输出文件,因为未封闭的文件可能并没有全部刷新其缓冲区的预期(数据作为关闭文件的一部分),导致只有部分输出文件。

因此,虽然您不必使用with来打开文件,但它确实可以更轻松地管理它们,并且还可以关闭文件,即减少一件让您担心的事情,这就是为什么建议。