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

Python 为什么';调用file.close()后释放文件句柄?,python,Python,我在windows上使用Python 2.5。我有一个打开的文件要写。我写了一些数据。调用文件关闭。当我尝试使用Windows资源管理器从文件夹中删除该文件时,它会出错,表示进程仍保留该文件的句柄 如果我关闭python,然后再试一次,它就会成功。它确实会关闭它们。 您确定调用了f.close()吗? 我刚刚测试了相同的场景,windows为我删除了该文件。您是否正在处理有关文件对象的任何异常?如果是,请确保错误处理如下所示: f = open("hello.txt") try: for

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

如果我关闭python,然后再试一次,它就会成功。

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

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

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无法获得垃圾回收。原因是在sys.traceback中仍将引用f,在这种情况下,唯一的解决方案是在finally块中手动调用close on f或将sys.traceback设置为None(我强烈建议使用前者)。

教程中解释:

with open('/tmp/workfile', 'r') as f:
    read_data = f.read()
当你书写或酸洗/解酸洗时,它也会起作用


没有必要使用try finally block:Java方式,而不是Python,我一直在寻找这个,因为同样的事情也发生在我身上。这个问题对我没有帮助,但我想我知道发生了什么

在我编写的脚本的原始版本中,我忽略了在文件中添加“finally”子句以防出现异常

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

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


当然,我不知道这是否是原始海报的情况,即使原始海报仍然存在,他们可能不记得具体情况,但症状相似,所以我想我应该添加这一点作为检查,适用于处于相同情况并正在寻找答案的任何人。

我使用中间文件:

导入操作系统
f=打开(“report.tmp”、“w”)
f、 写入(“{}”。格式(“Hello”))
f、 关闭()
os.system(“move report.tmp report.html”)#此行适用于Windows用户

我从来都不知道Pythons能轻松发布任何东西,更不用说可怜的小文件了P:P尝试发布显示错误的最小完整程序。这种情况不应该发生,因此可能需要简单的修复。如果之前的代码有可能引发异常,则您最肯定需要
finally
块,Davy:从python 2.5开始,file对象就配备了
\u enter\u
\u exit\u
方法。Python对表达式求值,调用
\u enter\u
方法,然后执行代码体,不管代码中发生了什么,都调用guard对象的
\u exit\u
方法。它处理异常并始终关闭文件。有了替补队员,我们终于可以试了。您必须启用它:
from\uuuuu future\uuuu使用\u语句导入