我在使用Python 2.5的Windows上。我有一个用于写作的打开文件。我写了一些数据。调用文件关闭。当我尝试使用Windows资源管理器从文件夹中删除文件时,它会出错,并说进程仍然保存文件的句柄。
如果我关闭python,然后重试,它会成功。
答案 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