调用file.close()后,为什么Python不释放文件句柄?

时间:2009-02-22 15:32:53

标签: python

我在使用Python 2.5的Windows上。我有一个用于写作的打开文件。我写了一些数据。调用文件关闭。当我尝试使用Windows资源管理器从文件夹中删除文件时,它会出错,并说进程仍然保存文件的句柄。

如果我关闭python,然后重试,它会成功。

5 个答案:

答案 0 :(得分:4)

关闭它们。 你确定f.close()被调用了吗? 我刚测试了相同的场景,Windows为我删除了文件。

答案 1 :(得分:3)

您是否正在处理文件对象周围的任何异常?如果是这样,请确保错误处理如下所示:

f = open("hello.txt")
try:
    for line in f:
        print line
finally:
    f.close()

在考虑为什么要这样做时,请考虑以下代码行:

f = open('hello.txt')
try:
    perform_an_operation_that_causes_f_to_raise_an_exception()
    f.close()
except IOError:
    pass

如您所见,上述代码中永远不会调用f.close。问题是上面的代码也会导致f没有收集垃圾。原因是f仍将在sys.traceback中引用,在这种情况下,唯一的解决方案是在finally块中手动调用close,或者将sys.traceback设置为None(我强烈推荐前者)。

答案 2 :(得分:3)

在教程中解释:

with open('/tmp/workfile', 'r') as f:
    read_data = f.read()

当你写作或腌制/去除颜色时它也有效

没有必要尝试最终阻止:Java的做事方式,而不是Python

答案 3 :(得分:0)

我一直在寻找这个,因为同样的事情发生在我身上。这个问题对我没有帮助,但我想我弄明白了发生了什么。

在我写的脚本的原始版本中,我忽略了添加“终于”#39;如果发生异常,则为该文件的子句。

我正在从交互式提示中测试脚本,并在文件打开时出现异常。我没有意识到的是文件对象没有立即被垃圾收集。之后,当我运行脚本(仍然来自同一个交互式会话)时,即使 new 文件对象被关闭,第一个仍然没有,所以文件句柄从操作系统的角度来看,它仍在使用中。

一旦我关闭了交互式提示,问题就消失了,我记得在文件打开时发生异常,并意识到发生了什么。 (道德:不要尝试对睡眠不足进行编程。:))

当然,我不知道这是不是原始海报的情况,即使原始海报仍然存在,他们可能不记得具体情况,但症状是相似的,所以我想我和#39; d将此添加为要检查的内容,适用于遇到相同情况并寻找答案的任何人。

答案 4 :(得分:0)

我使用中间文件来做到这一点:

import os

f = open("report.tmp","w")
f.write("{}".format("Hello"))
f.close()
os.system("move report.tmp report.html") #this line is for Windows users