IT-Swarm.Net

如何在python 2.4中安全地打开/关闭文件

我目前正在编写一个小脚本,可以在我们的一个服务器上使用Python。服务器只安装了Python 2.4.4。

直到2.5出来之后我才开始使用Python,所以我习惯了以下形式:

with open('file.txt', 'r') as f:
    # do stuff with f

但是,2.5之前没有with语句,而且我无法找到有关手动清理文件对象的正确方法的示例。

使用旧版本的python时,安全处理文件对象的最佳做法是什么?

78
TM.

请参阅 docs.python.org

完成文件后,调用f.close()将其关闭并释放打开文件占用的所有系统资源。调用f.close()后,尝试使用该文件对象将自动失败。

因此,优雅地使用close()try/finally

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

这确保即使# do stuff with f引发异常,f仍将正确关闭。

请注意open应出现在try outside 之后。如果open本身引发异常,则文件未打开且不需要关闭。此外,如果open引发异常,则其结果为 not 赋值给f,并且调用f.close()是错误的。

131
Jon-Eric

在上面的解决方案中,这里重复:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

如果在成功打开文件之后和尝试之前发生了不好的事情(你永远不知道......),文件将不会被关闭,因此更安全的解决方案是:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()
31
mljrg

如果您使用以下内容,则无需根据文档关闭文件:

在处理文件对象时,最好使用with关键字。这样做的好处是,即使在路上引发异常,文件也会在套件完成后正确关闭。它也比编写等效的try-finally块短得多:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

更多信息: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

1
user3765030