4

我经常在阅读后不关闭文件

for line in open(FileName):
    # do something

我还在同一个程序中再次重新打开该文件。

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

我的问题是这种方法是否有任何缺点?我看过声称该文件应该打开的帖子with

with open(FileName) as fp:

但是这种方法有什么好处呢?

4

2 回答 2

4

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

不过有几个问题:

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

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

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

总之,这根本不值得麻烦。始终使用with,忘记这些问题。无论如何,在编程时要记住足够的东西。

于 2012-07-27T11:03:26.600 回答
0

重新使用with

使用打开/管理文件的主要优点with是,当您退出与. 如果遇到异常,文件也会关闭。with

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

请注意,特别是在您正在写入的文件的情况下,您可能无法在输出文件中获得您期望的所有数据,因为未关闭的文件可能没有刷新其所有缓冲区(这作为关闭文件的一部分自动发生),导致只有部分输出文件。

因此,虽然您不必使用with它来打开文件,但它确实使管理它们变得更容易,并且还可以关闭您的文件,即您不必担心的一件事,这就是推荐的原因。

于 2012-07-27T10:59:01.697 回答