使用openpyxl匹配两个Excel文件个体ID仅能找到首条匹配项求助
跨Excel文件按个体ID匹配数据的问题修复
现有代码的核心错误
- 内层遍历第二个表格时没有重置
patient2变量,第一次遍历结束后如果patient2被赋值为空值,后续遍历会直接触发break跳出循环,因此只能找到第一条匹配 - 内外层循环都使用
row作为行变量名,会覆盖外层的行数据,导致外层遍历异常 - openpyxl的行索引从1开始,
ws2.iter_rows(min_row=0)的参数设置错误,不会生效 - 逐单元格双重遍历的逻辑冗余,没有必要遍历所有单元格来提取ID和表头,执行效率极低
优化后实现方案
推荐先将第二个表的个体ID和对应行的映射关系提前存入字典,仅需一次遍历即可完成后续所有匹配查询,逻辑更清晰也不会出现循环异常问题,参考代码如下:
import openpyxl # 加载两个工作簿 wb_target = openpyxl.load_workbook('/Users/miguelnobremenezes/Documents/Code/Excel_fill/45_24M_ECOCARDIOGRAMA.xlsx') ws_target = wb_target.active wb_source = openpyxl.load_workbook('/Users/miguelnobremenezes/Documents/Code/Excel_fill/echo_CB.xlsx') ws_source = wb_source.active # 第一步:先构建源文件的ID-行号映射字典,一次遍历即可 id_row_map = {} # 跳过表头行从第2行开始遍历源文件 for row_num in range(2, ws_source.max_row + 1): patient_id = ws_source.cell(row=row_num, column=1).value if patient_id: # 跳过ID为空的行 id_row_map[patient_id] = row_num # 第二步:遍历目标文件匹配ID # 跳过表头从第2行开始 for target_row in range(2, ws_target.max_row + 1): target_id = ws_target.cell(row=target_row, column=1).value # 查字典看ID是否存在于源文件 if target_id in id_row_map: print(f"匹配成功,个体ID:{target_id}") source_row = id_row_map[target_id] # 后续可补充表头匹配、参数赋值逻辑: # for col in range(2, ws_target.max_column +1): # header = ws_target.cell(row=1, column=col).value # 到源文件查找对应表头的列完成赋值即可 # 保存修改后的目标文件可取消注释下方代码 # wb_target.save("填充完成的文件.xlsx")
如果仍要保留原双重循环逻辑修改,只需在每次遍历ws2前重置patient2 = 0,修改min_row=2跳过表头,同时重命名内层行变量即可,但字典映射方案执行效率要高出数个量级,更推荐使用。
内容的提问来源于stack exchange,提问作者Miguel Nobre Menezes
相关产品推荐
相关产品推荐

