为何使用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
相关产品推荐
相关产品推荐

