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

字典已存在对应Key仍触发KeyError?链式合并字典遇问题

解决字典链式合并的KeyError问题

问题根源

你当前的csv_read_to_dict函数存在两个关键问题,直接导致合并时触发KeyError:

  1. 直接覆盖字典值:每次处理CSV行时,你直接给final_dict[data[0]]赋值一个仅包含SEM_4的全新字典。如果目标字典中已有该学生ID的条目,原有SEM_1/SEM_2数据会被完全覆盖;如果合并时尝试访问目标字典中不存在的学生ID,就会触发KeyError。
  2. CSV读取逻辑冗余:手动循环跳过表头的写法可简化,且未用with语句管理文件,存在资源泄漏风险。

修复方案

1. 优化CSV转字典函数

修改函数,让它生成仅包含目标SEM层级的字典,而非覆盖整个学生条目,同时优化文件操作:

import csv

def csv_read_to_dict(fl_name, sem_key):
    # 用with自动管理文件关闭,避免资源泄漏
    with open(fl_name, "r") as file:
        data = csv.reader(file)
        next(data)  # 直接跳过表头行,无需手动生成列表
        
        sem_dict = {}
        for row in data:
            student_id = row[0]
            # 仅生成当前SEM的Subject结构
            sem_data = {
                "Subject": {
                    "OS": row[2],
                    "OOP": row[3],
                    "COA": row[4],
                    "DM": row[5],
                    "Management": row[6]
                }
            }
            # 存储当前SEM的数据,不覆盖学生的其他SEM条目
            sem_dict[student_id] = {sem_key: sem_data}
        return sem_dict

2. 安全合并字典的方法

使用字典的setdefault方法,确保合并时不会因学生ID不存在触发KeyError,同时保留原有SEM数据:

# 假设已有包含SEM_1/SEM_2的字典为existing_dict
existing_dict = {
    "S101": {
        "SEM_1": {"Subject": {...}},
        "SEM_2": {"Subject": {...}}
    },
    # 其他学生条目...
}

# 读取SEM_4的CSV数据
sem4_data = csv_read_to_dict("sem4_data.csv", "SEM_4")
# 读取SEM_3的CSV数据(如果有单独文件)
sem3_data = csv_read_to_dict("sem3_data.csv", "SEM_3")

# 合并SEM_4到已有字典
for student_id, sem_data in sem4_data.items():
    # 如果学生ID不存在,自动创建空字典;存在则直接获取现有条目
    student_entry = existing_dict.setdefault(student_id, {})
    # 合并SEM_4数据,不会覆盖原有SEM_1/SEM_2
    student_entry.update(sem_data)

# 同理合并SEM_3
for student_id, sem_data in sem3_data.items():
    student_entry = existing_dict.setdefault(student_id, {})
    student_entry.update(sem_data)

关键说明

  • setdefault(student_id, {}):确保学生ID不在现有字典中时,自动创建空字典作为该ID的值,彻底避免KeyError。
  • update(sem_data):将新的SEM层级(如SEM_4)合并到学生条目中,完全保留已有的SEM_1/SEM_2数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:32:45