我目前正在编写一个小脚本,供在使用Python的一台服务器上使用。该服务器仅安装了Python 2.4.4。
直到2.5版本问世,我才开始使用Python,所以我习惯了这种形式:
with open('file.txt', 'r') as f:
# do stuff with f
但是,with
在2.5之前没有声明,而且我很难找到有关手动清理文件对象的正确方法的示例。
使用旧版本的python时安全处置文件对象的最佳实践是什么?
Answers:
处理完文件后,调用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()
。
open
失败,将在try/finally
进入该块之前引发异常。因此close
不会被调用。(这就是为什么您应该open
在try
。之前致电的原因。)
open
引发异常的注释。
在上述解决方案中,在此重复:
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()
with open(...)
绝对是现代Python中的最佳选择。
如果用于以下用途,则无需根据文档关闭文件:
在处理文件对象时,最好使用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
这是给出的示例,说明如何使用open
和“ pythonclose
from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()
您必须打开文件多少次才能关闭该时间。
open
但之前引发了异常close
,则无法使用这种方法正确关闭文件。使用with
或try
/finally
即使在异常的情况下能够正确地关闭文件。