如何在Python 2.4中安全地打开/关闭文件
我现在正在为我们的一个服务器写一个小脚本,使用的是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 个回答
根据文档,如果你使用了 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
在上面的解决方案中,重复一下:
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()
请查看 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()
就会出错。