Python脚本写入文件中途触发PermissionError[Errno13]的解决求助
解决Python写入文件时出现
PermissionError: [Errno 13] Permission denied的问题 问题描述
运行Python脚本时,初期能正常将内容写入indirect_mapping_icd10cm.txt文件,但一段时间后出现报错:
PermissionError: [Errno 13] Permission denied: 'indirect_mapping_icd10cm.txt'
相关代码片段:
def ancestor_map(id): row_icd = umls[umls['AUI'] == id] cui = row_icd.CUI.to_string(index=False) if cui in df_mdr_pt_llt['CUI'].values: match = df_mdr_pt_llt[df_mdr_pt_llt['CUI'] == cui] match = match[["CODE", "STR", "TTY", "SDUI"]].drop_duplicates() match["icd_code"] = icd_code match["icd_term"] = icd_term match["level"] = level match["is_a"] = 'indirect_rel' match = match.loc[:, ["icd_code","icd_term","CODE","STR", "TTY", "SDUI", "level", "is_a"]] match.to_csv(r'indirect_mapping_icd10cm.txt', header=None, index=None, sep='\t', mode='a') else: print ('match not found: continue')
可行的解决办法
1. 批量收集数据后一次性写入
当前代码每次匹配到内容就打开文件追加写入,频繁IO操作可能导致系统锁定文件(尤其Windows系统)。改为先缓存所有结果,最后统一写入:
# 在外层定义列表存储所有结果 result_buffer = [] def ancestor_map(id): global result_buffer row_icd = umls[umls['AUI'] == id] cui = row_icd.CUI.to_string(index=False) if cui in df_mdr_pt_llt['CUI'].values: match = df_mdr_pt_llt[df_mdr_pt_llt['CUI'] == cui] match = match[["CODE", "STR", "TTY", "SDUI"]].drop_duplicates() match["icd_code"] = icd_code match["icd_term"] = icd_term match["level"] = level match["is_a"] = 'indirect_rel' match = match.loc[:, ["icd_code","icd_term","CODE","STR", "TTY", "SDUI", "level", "is_a"]] # 将当前结果加入缓存 result_buffer.extend(match.values.tolist()) else: print ('match not found: continue') # 所有调用完成后,一次性写入文件 import pandas as pd if result_buffer: result_df = pd.DataFrame(result_buffer, columns=["icd_code","icd_term","CODE","STR", "TTY", "SDUI", "level", "is_a"]) result_df.to_csv('indirect_mapping_icd10cm.txt', header=None, index=None, sep='\t')
2. 显式管理文件句柄
如果必须分批写入,用with语句确保文件每次都正确关闭,避免句柄泄漏:
def ancestor_map(id): row_icd = umls[umls['AUI'] == id] cui = row_icd.CUI.to_string(index=False) if cui in df_mdr_pt_llt['CUI'].values: match = df_mdr_pt_llt[df_mdr_pt_llt['CUI'] == cui] match = match[["CODE", "STR", "TTY", "SDUI"]].drop_duplicates() match["icd_code"] = icd_code match["icd_term"] = icd_term match["level"] = level match["is_a"] = 'indirect_rel' match = match.loc[:, ["icd_code","icd_term","CODE","STR", "TTY", "SDUI", "level", "is_a"]] # 用with语句确保文件操作完成后自动关闭 with open('indirect_mapping_icd10cm.txt', 'a', encoding='utf-8') as f: match.to_csv(f, header=None, index=None, sep='\t') else: print ('match not found: continue')
3. 排查文件权限与占用问题
- 确认脚本运行用户对文件所在目录有写入权限,避免保存到系统级目录(如
C:\Windows),换用用户文档等有权限的目录。 - 检查文件是否被其他程序占用(比如记事本、Excel、数据分析软件),关闭这些程序后再运行脚本。
4. 使用绝对路径避免路径歧义
不要依赖相对路径,改用绝对路径确保脚本始终指向正确文件:
# 替换为你的实际绝对路径 file_path = r'C:\Users\YourName\Documents\indirect_mapping_icd10cm.txt' match.to_csv(file_path, header=None, index=None, sep='\t', mode='a')
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

