Python技术问询:计数器递增时为字典添新键及Excel数据处理
问题分析
先看你当前代码的核心问题:values列表是在循环外初始化的,每次处理符合条件的行时,你只是往同一个列表里追加单元格值,没有重置,导致所有字典的键都指向同一个累积了所有数据的列表——这就是为什么你看到的输出里10L对应的列表包含了11、30等行的内容。
另外,show = sheet[str(rowidx)]这个写法也存在问题(取决于你用的Excel处理库,比如openpyxl里获取整行应该是sheet[rowidx],不需要转成字符串),而且key的获取和你一开始取的row完全重复,可以简化。
解决方案
要实现每个目标ID作为键,对应自己行的单元格值,并且在处理每一行(计数器递增)时正确生成独立的键值对,我们需要做以下调整:
- 每次处理新行时重置值列表:确保每个键对应的数据只来自当前行,不会累积之前的内容。
- 修正整行单元格的获取逻辑:根据常用Excel库的规范调整行的获取方式。
- 简化键的获取操作:直接用已取到的ID作为键,避免重复操作。
修正后的代码(基于openpyxl库)
# 不要用dict作为变量名,会覆盖Python内置的dict类型 result_dict = {} # 从第2行遍历到最后一行(openpyxl行号从1开始) for rowidx in range(2, sheet.max_row + 1): # 获取A列的ID值 row_id = sheet['A' + str(rowidx)].value # 检查ID是否在目标列表中 if row_id in [10, 11, 30]: # 重置值列表,确保只存储当前行的数据 row_values = [] # 获取当前行的所有单元格 current_row = sheet[rowidx] # 遍历单元格收集值 for cell in current_row: row_values.append(cell.value) # 将ID作为键,当前行值列表作为值存入字典 result_dict[row_id] = row_values # 输出结果 print(result_dict)
如果你用的是xlrd库
xlrd的行/列索引从0开始,代码可以更简洁:
import xlrd workbook = xlrd.open_workbook('你的文件路径.xlsx') sheet = workbook.sheet_by_index(0) result_dict = {} # 从第2行开始(对应xlrd的索引1) for rowidx in range(1, sheet.nrows): row_id = sheet.cell_value(rowidx, 0) # 第0列是A列 if row_id in [10, 11, 30]: # 直接获取整行的值 row_values = sheet.row_values(rowidx) result_dict[row_id] = row_values print(result_dict)
如果你需要用行号作为递增的键
如果你的“计数器递增时将下一项作为键”是指用行号作为键(按遍历顺序递增),只需要把row_id换成rowidx即可:
result_dict[rowidx] = row_values
内容的提问来源于stack exchange,提问作者Raghav Patnecha
相关产品推荐
相关产品推荐

