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

求助:如何用openpyxl去除Excel中(name,company)元组重复项?代码排查

问题排查与修正方案

我来帮你排查下代码里的问题,你的去重逻辑确实有几个关键漏洞,导致没达到预期效果:

代码中的核心问题

  • 重复判断逻辑错误:内层循环遍历列表l时,你只要发现有一个元素和当前元组不相等,就直接添加新元组,这会导致同一元组被重复添加多次,完全起不到去重作用。
  • 元组赋值笔误:你定义的对比元组r写成了(u_names[x].value, u_names[x].value),这是两个名字的组合,和你要去重的(name, company)元组完全不匹配。
  • 遍历逻辑冗余且漏数据:外层循环用range(len(u_names)-1),再加上多余的i变量和终止判断,会导致你漏掉最后一行的数据。
  • 使用已弃用API:get_sheet_by_name在新版openpyxl中已经被弃用,建议直接通过工作表名称索引获取。

修正后的代码方案

方案1:用集合自动去重(简单高效,不保留原始顺序)

集合会自动过滤重复元素,是处理去重最简洁的方式:

from openpyxl import load_workbook

# 加载工作簿和工作表
updated = load_workbook('abc.xlsx')
u_wb = updated['SP_Table']  # 替代已弃用的get_sheet_by_name

unique_tuples = set()

# 遍历行(从第2行开始,假设第1行是表头)
for row in u_wb.iter_rows(min_row=2, values_only=True):
    name = row[5]  # F列是第6列,索引从0开始
    company = row[2]  # C列是第3列,索引从0开始
    # 跳过空值的情况
    if name is not None and company is not None:
        unique_tuples.add((name, company))

# 转换为列表(如果需要列表格式)
unique_list = list(unique_tuples)
print("Number of contacts:", len(unique_list))

方案2:用列表保留原始顺序去重

如果需要保留元组在Excel中出现的先后顺序,可以用列表结合判断:

from openpyxl import load_workbook

updated = load_workbook('abc.xlsx')
u_wb = updated['SP_Table']

unique_list = []

for row in u_wb.iter_rows(min_row=2, values_only=True):
    name = row[5]
    company = row[2]
    if name is not None and company is not None:
        current_tuple = (name, company)
        if current_tuple not in unique_list:
            unique_list.append(current_tuple)

print("Number of contacts:", len(unique_list))

关键优化点说明

  • 用iter_rows(values_only=True)直接获取单元格的值,比单独取列再遍历更简洁高效。
  • 明确判断name和company都不为空,避免无效的空值元组。
  • 利用集合的唯一性特性,或者列表的in判断,实现正确的去重逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:44:12