You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openpyxl按索引删除行时存在遗漏问题求助

问题分析与修复方案

你的代码存在几个明确错误,导致总有一行不匹配的行无法被删除,具体问题和修复如下:

核心错误点

  • 变量名混乱:
    • 你将Wb2的Sheet1赋值给了sheet变量,但后续遍历却用了未定义的sheet1,遍历对象完全错误
    • 最后删除行时用了未定义的sheet8,应该替换为前面的sheet变量
  • 遍历范围遗漏:
    • 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")

关键修复说明

  1. 修正所有变量名错误,确保遍历和删除操作都针对正确的工作表
  2. 调整遍历范围为max_row,不再漏掉最后一行
  3. 修复row[0].value的语法错误
  4. 增加工作簿保存代码,否则所有修改都不会写入文件
  5. 改用集合存储匹配值,优化大规模数据的查找性能

内容的提问来源于stack exchange,提问作者PiAlx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:22:30