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

TM.*_*TM. 81 python file-io python-2.4

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

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

with open('file.txt', 'r') as f:
    # do stuff with f
Run Code Online (Sandbox Code Playgroud)

但是,with2.5之前没有声明,我无法找到有关手动清理文件对象的正确方法的示例.

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

Jon*_*ric 133

请参阅docs.python.org:

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

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

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

try:
    # do stuff with f
finally:
    f.close()
Run Code Online (Sandbox Code Playgroud)

这样可以确保即使# do stuff with f引发异常,f仍然可以正常关闭.

需要注意的是open应该出现之外try.如果open它本身引发异常,则文件未打开且不需要关闭.此外,如果open引发异常,则不f会将结果分配给它,并且调用它是错误的f.close().

  • 如果`open`失败,则在输入`try/finally`块之前会引发异常.所以`close`不会被调用.(这就是为什么你应该在`try`之前调用`open`.) (15认同)
  • 这就是with语句转化为幕后的内容. (4认同)

mlj*_*jrg 32

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

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

try:
    # do stuff with f
finally:
   f.close()
Run Code Online (Sandbox Code Playgroud)

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

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

    # do stuff with f

finally:
    if f is not None:
       f.close()
Run Code Online (Sandbox Code Playgroud)

  • 这是对的.它为什么被投票? (5认同)

小智 12

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

在处理文件对象时使用 with 关键字是一种很好的做法。这样做的好处是文件在其套件完成后会被正确关闭,即使在途中引发异常也是如此。它也比编写等效的 try-finally 块要短得多:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True
Run Code Online (Sandbox Code Playgroud)

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