如何用Python读取Excel列数据,查找Value列重复值并优化现有脚本
原脚本存在的问题
- 资源泄漏风险:未使用上下文管理器打开文件,运行出现异常时可能无法正常关闭文件句柄
- 性能极低:多次调用
list.count()方法+3次全量遍历数据集,时间复杂度为O(n²),数据量偏大时运行效率极差 - 逻辑容错性差:将Name和Value拼接后再拆分的逻辑,遇到Name字段自带逗号的场景会直接出错
- 输出不符合要求:最终输出的是一维列表,不是要求的「Value为键、对应Name数组为值」的字典结构
优化后代码
import csv import json from collections import defaultdict # 初始化映射存储结构 value_map = defaultdict(list) # 用with自动管理文件生命周期,无需手动关闭 with open('columnData.csv', 'r', encoding='utf-8') as f: csv_reader = csv.reader(f) # 跳过表头行 next(csv_reader) for name, val in csv_reader: # strip处理规避字段首尾空格/换行导致的统计误差 value_map[val.strip()].append(name.strip()) # 筛选出Value重复的条目 result = {val: name_list for val, name_list in value_map.items() if len(name_list) >= 2} # 按要求格式输出 print(json.dumps(result, indent=2, ensure_ascii=False))
如果不想引入collections依赖,也可以用原生字典实现存储逻辑:
value_map = {} # 遍历部分替换为 for name, val in csv_reader: name = name.strip() val = val.strip() if val not in value_map: value_map[val] = [] value_map[val].append(name)
优化点说明
- 时间复杂度降到O(n):仅遍历一次数据集完成统计,无冗余遍历和高耗时计算
- 资源操作更安全:
with语句会自动处理文件关闭,异常场景也不会出现资源泄漏 - 逻辑更简洁可靠:直接用字典做映射存储,没有多余的拼接、拆分中间步骤,也避免了字段含逗号导致的逻辑错误
- 输出完全匹配需求:最终结果和要求的格式完全一致,
json.dumps的缩进参数保证输出的排版和示例相同 - 容错性增强:对读取的字段做了去首尾空白处理,避免原始数据里的隐形字符导致统计错误
内容的提问来源于stack exchange,提问作者liuxu
相关产品推荐
相关产品推荐

