如何用openpyxl为Excel指定列每行单元格分配独立变量?
解决Excel单元格数据分配到字典键时被全部覆盖的问题
问题描述
需要遍历Excel某特定列的指定行范围(第13到33行,第8列),将每行单元格的数据分配给字典中独立的mac1、mac2...macN键。当前使用三层循环实现,但所有字典键最终都被最后一行单元格的值覆盖,无法对应到各自的行数据。
原代码
# Iterates through rows in the MAC Address column for row in ws.iter_rows(min_row=13, min_col=8, max_row=33, max_col=8): for cell in row: #Creates a dictionary to assign a variable for each cell d = {} #This loop is supposed to assign a new variable for each cell's value for i in range(1,14): # for looping d["mac{0}".format(i)] = cell.value
错误输出
{'mac1': '00:00:00:00:00:00', 'mac2': '00:00:00:00:00:00', 'mac3': '00:00:00:00:00:00'...}
问题原因
原代码逻辑存在两处关键错误:
- 字典重复初始化:每次遍历单元格时都重新创建空字典
d,之前的赋值结果被完全覆盖。 - 键值重复赋值:内层循环会把所有
mac1到mac13键都赋值为当前单元格的值,导致每个单元格处理完后,字典里所有键都是同一个值,最终仅保留最后一个单元格的内容。
修正方案
方案一:遍历行时同步赋值对应键
通过enumerate获取行的索引(从1开始),直接为每个macN键分配对应行的单元格值:
# 先初始化空字典 d = {} # 遍历指定范围的行,同时获取从1开始的索引 for idx, row in enumerate(ws.iter_rows(min_row=13, min_col=8, max_row=33, max_col=8), start=1): # 单列数据,取row中的第一个单元格值 cell_value = row[0].value # 给对应索引的mac键赋值 d[f"mac{idx}"] = cell_value
方案二:先收集所有值再生成字典
用列表推导式先提取所有目标单元格的值,再通过字典推导式生成键值对,逻辑更简洁:
# 提取指定范围的所有单元格值 mac_values = [row[0].value for row in ws.iter_rows(min_row=13, min_col=8, max_row=33, max_col=8)] # 生成对应的mac字典,索引从1开始 d = {f"mac{i+1}": val for i, val in enumerate(mac_values)}
两种方案都能实现:第13行对应mac1,第14行对应mac2,以此类推,直到第33行对应mac21(因为33-13+1=21行数据)。
内容的提问来源于stack exchange,提问作者Student1860
相关产品推荐
相关产品推荐

