使用openpyxl按索引删除行时存在遗漏问题求助
问题分析与修复方案
你的代码存在几个明确错误,导致总有一行不匹配的行无法被删除,具体问题和修复如下:
核心错误点
- 变量名混乱:
- 你将Wb2的Sheet1赋值给了
sheet变量,但后续遍历却用了未定义的sheet1,遍历对象完全错误 - 最后删除行时用了未定义的
sheet8,应该替换为前面的sheet变量
- 你将Wb2的Sheet1赋值给了
- 遍历范围遗漏:
iter_rows(2,sheet1.max_row-1)中的max_row-1会跳过最后一行,导致最后一行的不匹配值无法被加入删除列表
- 语法错误:
list1.append(row[0].)value多了一个多余的点,正确写法是row[0].value
额外优化建议
将list1改为集合(set),集合的成员判断in操作效率远高于列表,数据量越大差异越明显。
修复后的完整代码
from openpyxl import load_workbook Wb2 = load_workbook("workbook2.xlsx") sheet = Wb2["Sheet1"] # 直接指定目标工作表 Wb1 = load_workbook("workbook.xlsx") sheet2 = Wb1["Sheet1"] # 用集合存储匹配值,提升查找效率 list1 = set() for row in sheet2.iter_rows(min_row=1, max_row=sheet2.max_row): list1.add(row[0].value) print(len(list1)) list2 = [] # 遍历从第2行(跳过表头)到最后一行,不再遗漏行 for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row): if row[3].value not in list1: list2.append(row[0].row) else: print(row[3].value, "在列表中") # 倒序删除行,避免索引偏移问题 for row_idx in reversed(list2): sheet.delete_rows(row_idx) # 必须保存才能让修改生效 Wb2.save("workbook2_updated.xlsx")
关键修复说明
- 修正所有变量名错误,确保遍历和删除操作都针对正确的工作表
- 调整遍历范围为
max_row,不再漏掉最后一行 - 修复
row[0].value的语法错误 - 增加工作簿保存代码,否则所有修改都不会写入文件
- 改用集合存储匹配值,优化大规模数据的查找性能
内容的提问来源于stack exchange,提问作者PiAlx
相关产品推荐
相关产品推荐

