如何用openpyxl记录Excel比对中未匹配的行?
基于openpyxl实现Excel匹配项与未匹配项的完整记录
核心修改思路
- 预提取目标数据到集合:先把
Azure-Scrape.xlsx中用于比对的列(比如A列)所有值提取到一个集合里,集合的查找效率远高于嵌套循环,能大幅提升处理速度。 - 遍历并区分匹配状态:遍历
Azure-Provider-description.xlsx的每一行,检查该行目标值是否在Scrape的集合中:- 匹配项:按原有逻辑记录到
Azure-Actions.xlsx - 未匹配项:新增状态标注,同时保留原行关键信息
- 匹配项:按原有逻辑记录到
修改后的代码示例
假设你是比对两表的A列内容,以下是完整可运行的代码:
from openpyxl import load_workbook, Workbook # 加载三个工作簿 wb_desc = load_workbook('Azure-Provider-description.xlsx') ws_desc = wb_desc.active wb_scrape = load_workbook('Azure-Scrape.xlsx') ws_scrape = wb_scrape.active wb_actions = Workbook() ws_actions = wb_actions.active # 写入表头(可根据实际需求调整列名) ws_actions.append(['原行号', '原比对内容', '匹配状态', '匹配结果']) # 提取Scrape表中用于比对的所有值到集合(跳过空值) scrape_targets = set() for row in ws_scrape.iter_rows(min_row=2, values_only=True): if row[0] is not None: scrape_targets.add(row[0]) # 遍历Description表的每一行,分别处理匹配与未匹配情况 for row_idx, row in enumerate(ws_desc.iter_rows(min_row=2, values_only=True), start=2): target_val = row[0] # 先组装原行基础信息 record = [row_idx, target_val] if target_val in scrape_targets: # 匹配项:按原有逻辑记录结果 record.extend(['已匹配', target_val]) else: # 未匹配项:标注状态,可按需补充原行其他列内容 record.extend(['未匹配', '无对应匹配项']) ws_actions.append(record) # 保存最终结果 wb_actions.save('Azure-Actions.xlsx')
关键修改点说明
- 用
scrape_targets集合替代嵌套循环查找,避免重复遍历Scrape表,处理大文件时效率提升明显 - 新增
匹配状态列,清晰区分已匹配和未匹配的行,方便后续筛选 - 保留原行号和原比对内容,便于快速溯源到原始数据
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

