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