我经常在阅读后不关闭文件
for line in open(FileName):
# do something
我还在同一个程序中再次重新打开该文件。
for line in open(FileName):
# do something else
我的问题是这种方法是否有任何缺点?我看过声称该文件应该打开的帖子with
with open(FileName) as fp:
但是这种方法有什么好处呢?
我经常在阅读后不关闭文件
for line in open(FileName):
# do something
我还在同一个程序中再次重新打开该文件。
for line in open(FileName):
# do something else
我的问题是这种方法是否有任何缺点?我看过声称该文件应该打开的帖子with
with open(FileName) as fp:
但是这种方法有什么好处呢?
在某些情况下,您可能会在没有遇到不利影响的情况下不关闭文件而侥幸逃脱。CPython(最流行的 Python 实现)将在使用 循环后立即关闭文件for line in open("filename"):
,前提是不存在对该文件的进一步引用。在其他 Python 实现中,关闭文件可能会延迟,但最终会被关闭。
不过有几个问题:
有时对文件的隐藏引用仍然存在。如果在函数中抛出异常,则与异常关联的回溯包含对函数执行框架的引用,因此所有局部变量继续存在——即使在 CPython 中,这可能会使文件打开的时间比预期的要长。
打开许多文件时,您可能会用完文件描述符,因为您无法控制它们再次关闭的时间。
Python 3.2 或更高版本将为每个未关闭的文件引发一个ResourceWarning
(可以禁用此警告,但无论如何)。
总之,这根本不值得麻烦。始终使用with
,忘记这些问题。无论如何,在编程时要记住足够的东西。
重新使用with
:
使用打开/管理文件的主要优点with
是,当您退出与. 如果遇到异常,文件也会关闭。with
不关闭文件是不整洁的编程。
请注意,特别是在您正在写入的文件的情况下,您可能无法在输出文件中获得您期望的所有数据,因为未关闭的文件可能没有刷新其所有缓冲区(这作为关闭文件的一部分自动发生),导致只有部分输出文件。
因此,虽然您不必使用with
它来打开文件,但它确实使管理它们变得更容易,并且还可以关闭您的文件,即您不必担心的一件事,这就是推荐的原因。