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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:27:38