阅读后没有关闭文件有什么缺点吗?

时间:2012-07-27 10:54:18

标签: python

我经常在阅读后关闭文件

for line in open(FileName):
    # do something

我也在同一个程序中重新打开文件。

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

我的问题是这种方法是否有任何缺点? 我看到过声称该文件应该以{{1​​}}

打开的帖子
with

但这种方法的优点是什么?

2 个答案:

答案 0 :(得分:4)

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

但是有一些问题:

  1. 有时对文件的隐藏引用仍然存在。如果在函数中抛出异常,则与异常关联的回溯包含对函数执行帧的引用,因此所有局部变量都会继续存在 - 即使在CPython中,这也可能使文件保持打开的时间超过预期。

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

  3. Python 3.2或更高版本将为每个未关闭的文件引发ResourceWarning(此警告可以被禁用,但无论如何)。

  4. 总之,它根本不值得麻烦。始终使用with,并忘记这些问题。无论如何,有足够的时间记住prgramming。

答案 1 :(得分:0)

重新使用with

使用with打开/管理文件的主要优点是,当您退出与with关联的“块”时,它们会自动关闭。如果遇到异常,该文件也会关闭。

保留未封闭的文件是不整齐的编程。

请注意,特别是在写入的文件的情况下,您可能无法获得输出文件中所需的所有数据,因为未关闭的文件可能没有刷新所有缓冲区(它会在关闭文件时自动发生),只会产生部分输出文件。

因此,虽然您不必使用with来打开文件,但它确实可以更轻松地管理它们,并且还可以关闭文件,也就是说,您可以放心一点,这就是推荐的原因。