You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用with open操作临时文件后仍报WinError32文件占用错误?

关于with语句操作文件和临时文件的问题解答

咱们来拆解你遇到的两个问题:

一、为什么会觉得with open代码块退出后文件没关闭?

其实这不是with open的问题!你用NamedTemporaryFile创建临时文件时,返回的tmp_file本身就是一个处于打开状态的文件对象——你只提取了它的文件名,但从来没关闭这个tmp_file句柄。所以哪怕with open的fp在代码块结束后正常关闭了,系统里还有tmp_file这个进程握着文件,看起来就像文件没被彻底关闭一样。

二、为什么会出现[WinError32] 文件被占用的错误?

核心原因还是上面这个:你创建临时文件后,NamedTemporaryFile返回的文件句柄tmp_file一直处于打开状态,当你后续尝试删除文件时,系统检测到这个文件还被另一个句柄(也就是tmp_file)占用着,所以抛出了无法访问的错误。

给你两种正确的写法:

写法一:先关闭NamedTemporaryFile返回的句柄

from pathlib import Path
from tempfile import NamedTemporaryFile

tmp_file = NamedTemporaryFile(delete=False)
tmp_file_name = tmp_file.name
tmp_file.close()  # 先关闭这个默认打开的句柄

with open(tmp_file_name, "w") as fp:
    print("Hello", file=fp)

Path(tmp_file_name).unlink()

写法二:直接用NamedTemporaryFile的对象写入(更简洁)

from pathlib import Path
from tempfile import NamedTemporaryFile

# 显式指定mode为文本写入模式,同时用with自动管理句柄
with NamedTemporaryFile(delete=False, mode="w") as tmp_file:
    print("Hello", file=tmp_file)

tmp_file_name = tmp_file.name
Path(tmp_file_name).unlink()

这种写法里with块结束后会自动关闭tmp_file句柄,后续删除文件就不会有占用冲突了。

额外提一句:NamedTemporaryFile默认的模式是'w+b'二进制读写,如果你要写入文本内容,最好显式指定mode="w"或者"w+t",避免出现编码相关的坑。

内容的提问来源于stack exchange,提问作者YellowPillow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:35:31