求助:如何用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
相关产品推荐
相关产品推荐

