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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:52:53