我目前正在编写一个小脚本,可以在我们的一台服务器上使用Python。服务器只安装了Python 2.4.4。
我没有开始使用Python直到2.5出来,所以我习惯了以下形式:
with open('file.txt', 'r') as f:
# do stuff with f
但是,2.5之前没有with
语句,而且我无法找到有关手动清理文件对象的正确方法的示例。
使用旧版本的python时,安全处理文件对象的最佳做法是什么?
答案 0 :(得分:132)
请参阅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()
会出错。
答案 1 :(得分:31)
在上述解决方案中,重复此处:
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()
答案 2 :(得分:1)
如果用于以下用途,则无需根据文档关闭文件:
在处理文件对象时,最好使用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
答案 3 :(得分:-4)
以下是给出的示例,以及如何使用open
和" python close
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()
打开文件的次数必须关闭那些时间。