Python使用openpyxl加载Excel到字典仅保留最后一行问题求解
问题原因
- 核心错误是遍历每行数据时,始终对
data字典的同一组固定Key执行赋值操作,新行数据会直接覆盖上一行的旧数据,循环结束后自然仅保留最后一行的内容。 - 原有数据结构不符合需求:你定义的
data和data['dict1']都是单层字典,既没有预留行号索引的层级,也没有按列名分组存储多值的结构。
解决方案
调整数据结构同时满足「按行号访问」和「按列名分组」两个需求,我们新增两个顶层Key:by_row负责按行号存储整行数据,by_column负责按列名存储该列所有值,实现代码如下:
import openpyxl from pathlib import Path xlsx_file = Path(Path.home(), 'FormaterPythonUniversity', 'Template.xlsx') wb_obj = openpyxl.load_workbook(xlsx_file) sheet = wb_obj.active # 初始化数据结构 data = { "by_row": {}, # 行号为Key,存储对应行的所有列数据 "by_column": {} # 列名为Key,存储该列所有行的取值列表 } # 读取第一行作为列名 col_names = [cell.value for cell in sheet[1]] # 初始化每列的空列表 for name in col_names: data["by_column"][name] = [] # 从第二行开始遍历数据行,行号从1开始计数 for row_num, row in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=1): # 存入按行索引的结构 data["by_row"][row_num] = { col_names[0]: row[0], col_names[1]: row[1], col_names[2]: row[2], col_names[3]: row[3], col_names[4]: row[4], col_names[5]: row[5] } # 追加到对应列的分组列表 for idx, name in enumerate(col_names): data["by_column"][name].append(row[idx]) # 使用示例 print("第1行数据的经理姓名:", data["by_row"][1]["Manager name"]) print("所有员工的邮箱列表:", data["by_column"]["Work email address"]) print(data)
使用说明
- 按行号访问单元格:调用格式为
data["by_row"][行号][列名],行号从1开始计数,对应Excel表格中表头后的第一行数据。 - 按列名取全列值:调用格式为
data["by_column"][列名],返回值为该列所有行数据组成的列表。
内容的提问来源于stack exchange,提问作者qamyk
相关产品推荐
相关产品推荐

