Python使用tempfile.NamedTemporaryFile时临时文件意外提前删除问题
问题根本原因
tempfile.NamedTemporaryFile 实例的默认行为是:当实例本身被Python垃圾回收机制回收时,会自动删除关联的临时文件,不需要你主动调用关闭操作。
你当前的代码仅保存了临时文件的路径字符串,没有保留NamedTemporaryFile实例本身:每次循环迭代结束后,上一次迭代创建的tmp实例会被新迭代的值覆盖,没有任何变量持有旧实例的引用,旧实例会被立刻回收,对应的临时文件也就被自动删除了。这就是你只能看到最近一个临时文件的原因。
符合需求的解决方案
你不需要设置delete=False,也不需要手动删除文件,只要修改代码,保留所有NamedTemporaryFile实例的引用即可:只要这些实例在脚本运行期间一直被持有,临时文件就不会被提前删除;脚本运行结束进程销毁时,所有实例被自动回收,关联的临时文件也会被自动清理,完全匹配你希望临时文件仅在脚本运行周期存在的要求。
修改后的参考代码:
import tempfile # 新增列表存储临时文件实例,维持引用避免被回收 tmp_instances = [] tmp_files = [] for i in range(40): tmp = tempfile.NamedTemporaryFile(suffix=".txt") with open(tmp.name, "w") as f: f.write(str(i)) tmp_instances.append(tmp) tmp_files.append(tmp.name) string = "" for tmp_file in tmp_files: with open(tmp_file, "r") as f: data = f.read() string += data print(string)
内容的提问来源于stack exchange,提问作者Alejandro Martinez
相关产品推荐
相关产品推荐

