使用openpyxl构建嵌套字典时被最后值覆盖及未知列名取值问题
Excel转嵌套字典问题修复及值提取方案
一、修复子字典被覆盖的问题
你的代码中所有子字典被最后一行覆盖的核心原因:sheet_data2字典在行循环外部初始化,每次循环仅更新该字典的内容,而Data中所有键都指向同一个字典对象,最终所有条目都会显示最后一次更新的结果。
修正后的代码
wb = openpyxl.load_workbook(path) sheet = wb.active max_col = sheet.max_column col_list = [] # 提取表头列名 for i in range(1, max_col + 1): cell_obj = sheet.cell(row=1, column=i) col_list.append(cell_obj.value) Data = {} # 遍历数据行,每次循环创建新的子字典 for row in sheet.iter_rows(min_row=2, values_only=True): sheet_name = row[0] sheet_data2 = {} # 每次迭代初始化新字典,避免引用复用 for i in range(1, max_col): sheet_data2[col_list[i]] = row[i] Data[sheet_name] = sheet_data2 print(Data)
运行后将得到你期望的输出:
{1: {'A': 30, 'B': 5, 'C': 2}, 2: {'A': 10, 'B': 9, 'C': 8}, 3: {'A': 65, 'B': 7, 'C': 42}, 4: {'A': 83, 'B': 1, 'C': 25}}
二、未知列名时提取指定值
如果需要从嵌套字典中提取符合条件的条目(例如找A:30的项),可以通过遍历外层字典的键值对,结合get()方法安全检查子字典中的目标键值:
示例代码
# 定义目标键和值 target_col = 'A' target_val = 30 # 提取所有匹配的完整条目 matched_items = [] for outer_key, inner_dict in Data.items(): # 用get()避免键不存在时抛出异常 if inner_dict.get(target_col) == target_val: matched_items.append({outer_key: inner_dict}) print(matched_items) # 输出:[{1: {'A': 30, 'B': 5, 'C': 2}}] # 仅提取外层键的简化写法 matched_outer_keys = [k for k, v in Data.items() if v.get(target_col) == target_val] print(matched_outer_keys) # 输出:[1]
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

