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

使用openpyxl转换LibreOffice Calc表格为字典时部分数据丢失的问题

问题

我用openpyxl库编写代码,想将Excel 2007-365格式的三列家用断路器管控表格(表头为ZONE、BREAKER、APPLIANCE)转换为字典,代码如下:

from openpyxl import load_workbook

# MAKE DICTIONARY FROM SPREADSHEET
workbook = load_workbook('Zonebreakers3col.xlsx')
sheet = workbook.active

for value in sheet.iter_rows(values_only = True):
    print(value)

data_dict = {} # make an empty dictionary
for row in sheet.iter_rows(min_row=2, values_only=True): # row 2 position[1] starts the actual data (row 1 is [0])
     header = row[0] # [0] is FIRST column HEADER NAME, WITH EACH ITERATION ROW[1] WOULD BE BREAKER
     breaker_data = {
         'ZONE' : row[0], # if in square brackets, then 0 is the first column which is ZONE.
         'BREAKER' : row[1], # row[1] indicates the second column location, BREAKER
         'APPLIANCE' : row[2]
         }
     print(row) # all spreadsheet data printed
     data_dict[header] = breaker_data
print(f'dictionary produced. {data_dict}\n')

# ONLY 16 OUT OF 39 KEY\VALUE PAIRS ARE PRODUCED
# How to get the all of the dictionary output.

表格数据示例:

ZONE BREAKER APPLIANCE

attic 1 roof fans
basement 1 sump pump
garage 1 bench outlet
kitchen 2 counter outlets
foyer 3 ceiling lights
foyer 5 fan
outside 6_8 central air
attic 11 light
garage 9 wall outlet
office 13 tract light
main bathroom 2 outlet

表格共有39行有效数据,但转换后仅生成16组键值对,部分重复项和单项被覆盖。循环已经遍历了所有行,但数据没有完全存入字典,需要实现完整转换以支持后续数据访问。

解决方法

问题根源

Python字典的键必须唯一,你用row[0](即ZONE字段)作为字典的键,而表格中存在多个相同的ZONE(比如attic、foyer都出现多次),后面的条目会直接覆盖掉之前相同键对应的内容,因此最终只保留了16个唯一ZONE对应的条目,而非全部39条。

方案1:按ZONE分组存储(保留同区域所有数据)

适合按区域查看所有关联的断路器和电器,将同一ZONE的所有数据整理为列表:

from openpyxl import load_workbook

workbook = load_workbook('Zonebreakers3col.xlsx')
sheet = workbook.active

data_dict = {}
for row in sheet.iter_rows(min_row=2, values_only=True):
    zone = row[0]
    breaker_info = {
        'BREAKER': row[1],
        'APPLIANCE': row[2]
    }
    # 若ZONE已存在则追加数据,否则创建新列表
    if zone in data_dict:
        data_dict[zone].append(breaker_info)
    else:
        data_dict[zone] = [breaker_info]

print(f"完整字典输出:{data_dict}\n")
# 示例访问:查看attic区域的所有断路器信息
print(f"attic区域的断路器:{data_dict.get('attic', [])}")

方案2:用唯一键存储每条独立数据

如果需要保留每一行的完整独立条目,可使用ZONE+BREAKER组合作为唯一键(假设同一区域内断路器编号不重复),或者直接用行号作为键:

from openpyxl import load_workbook

workbook = load_workbook('Zonebreakers3col.xlsx')
sheet = workbook.active

data_dict = {}
for row_num, row in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=2):
    # 生成唯一键:ZONE和BREAKER组合
    unique_key = f"{row[0]}_{row[1]}"
    data_dict[unique_key] = {
        'ZONE': row[0],
        'BREAKER': row[1],
        'APPLIANCE': row[2]
    }

print(f"完整字典输出,共{len(data_dict)}条数据:{data_dict}\n")
# 示例访问:查看foyer区域编号5的断路器信息
print(f"foyer区域5号断路器的电器:{data_dict.get('foyer_5', {})}")

方案3:存储为字典列表(最直观保留所有数据)

如果不需要按键分组,直接用列表存储每一行的字典结构,便于后续遍历和随机访问:

from openpyxl import load_workbook

workbook = load_workbook('Zonebreakers3col.xlsx')
sheet = workbook.active

data_list = []
for row in sheet.iter_rows(min_row=2, values_only=True):
    data_list.append({
        'ZONE': row[0],
        'BREAKER': row[1],
        'APPLIANCE': row[2]
    })

print(f"完整数据列表,共{len(data_list)}条数据:{data_list}\n")
# 示例访问:第3条数据(索引从0开始)
print(f"第3条数据:{data_list[2]}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:45:00