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

92 投票
4 回答
149451 浏览
提问于 2025-04-16 04:27

我现在正在为我们的一个服务器写一个小脚本,使用的是Python。这个服务器上只安装了Python 2.4.4。

我是在Python 2.5发布后才开始使用Python的,所以我习惯用这样的写法:

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

不过在2.5之前是没有with这个语句的,我在找关于如何手动清理文件对象的例子时遇到了困难。

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

4 个回答

13

根据文档,如果你使用了 with 关键字,就不需要手动关闭文件:

在处理文件时,使用 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

33

在上面的解决方案中,重复一下:

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()
145

请查看 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 之外。如果 open 本身出现了错误,说明文件没有成功打开,就不需要关闭它。此外,如果 open 出现错误,它的结果也不会被赋值给 f,这时调用 f.close() 就会出错。

撰写回答