字典已存在对应Key仍触发KeyError?链式合并字典遇问题
解决字典链式合并的KeyError问题
问题根源
你当前的csv_read_to_dict函数存在两个关键问题,直接导致合并时触发KeyError:
- 直接覆盖字典值:每次处理CSV行时,你直接给
final_dict[data[0]]赋值一个仅包含SEM_4的全新字典。如果目标字典中已有该学生ID的条目,原有SEM_1/SEM_2数据会被完全覆盖;如果合并时尝试访问目标字典中不存在的学生ID,就会触发KeyError。 - 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
相关产品推荐
相关产品推荐

