89

我目前正在编写一个小脚本,用于我们使用 Python 的服务器之一。服务器只安装了 Python 2.4.4。

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

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

但是,在 2.5 之前没有with声明,而且我很难找到有关手动清理文件对象的正确方法的示例。

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

4

4 回答 4

143

请参阅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().

于 2010-09-22T14:40:52.197 回答
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()
于 2015-02-23T12:31:18.780 回答
12

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

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

于 2019-02-22T22:26:34.967 回答
-5

这是给出的示例,如何使用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()

您打开文件必须关闭多少次是必要的。

于 2014-04-15T07:10:05.233 回答