循环调用写文件函数触发os.remove() [WinError 32]权限错误求助
解决Windows下文件占用的PermissionError问题
核心问题分析
你遇到的PermissionError是Windows文件系统的典型问题:即便用with语句确保文件关闭,底层文件句柄可能不会被操作系统立即释放,短时间内重复删除同一文件就会触发该错误。而且你原本的os.remove操作完全多余——open(filename, "w")模式本身就会清空已有文件内容,不需要先删除。
直接修复方案
删掉os.remove相关代码,直接用"w"模式打开文件即可,修改后的函数如下:
def mass_spectra_to_mgf(filename, mass_values_list, intensity_values_list, meta_list = None, filter_by_instrument_type = None, names=None, casnos=None): print(os.getpid(), flush=True) # 去掉多余的删除操作,w模式会自动清空文件 with open(filename, "w") as mgf_file: for i in range(len(mass_values_list)): if (meta_list): databaseid, intrumenttype = meta_list[i] if (filter_by_instrument_type and filter_by_instrument_type != intrumenttype): continue mgf_file.write("BEGIN IONS\n") mgf_file.write("DATABASEID=" + databaseid + "\n") mgf_file.write("INSTRUMENT=" + intrumenttype + "\n") else: mgf_file.write("BEGIN IONS\n") if (names != None): mgf_file.write("NAME=" + names[i] + "\n") if (casnos != None): mgf_file.write("CASNO=" + casnos[i] + "\n") for j in range(len(mass_values_list[i])): mass, intensity = mass_values_list[i][j], intensity_values_list[i][j] mgf_file.write(f"{mass} {intensity}\n") # 改用f-string更简洁 mgf_file.write("END IONS\n")
为什么这个方案有效
Python的open()函数使用"w"模式时,会自动执行两个操作:
- 如果文件不存在,创建新文件;
- 如果文件已存在,直接截断文件内容为0(清空文件)。
这完全替代了你先删除再创建的逻辑,还避免了删除与创建之间的时间窗口,从根源上消除了句柄残留导致的占用问题。
额外排查点
如果修改后仍报错,检查以下情况:
- 是否有其他程序(比如文件浏览器、记事本、杀毒软件)正在打开
myspectra.mgf?Windows下这类程序会锁定文件,导致无法修改。 - 确认之前的multiprocessing Pool已完全关闭,没有子进程残留(虽你说PID一致,仍可通过任务管理器检查是否有额外Python进程)。
内容的提问来源于stack exchange,提问作者Nicolas Romano
相关产品推荐
相关产品推荐

