如何检测CSV文件中不区分大小写的重复name字段?
不区分大小写检测CSV重复条目解决方案
问题场景
现有CSV文件file.csv内容如下:
name,apptype AppABC,python appabc,python AppABB,python AppABA,python Appaba,python
需求:找出name字段存在不区分大小写重复的条目,预期结果:
AppABC,python appabc,python AppABA,python Appaba,python
错误方法分析
1. CSV+RE模块报错
用户代码:
with open(appcsv_path) as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') for name in csv_reader: re.findall(name, csv_reader, flags=re.IGNORECASE)
错误原因:
csv_reader迭代返回的每一行是列表类型,不是字符串,直接传给re.findall会触发TypeError: unhashable type: 'list're.findall的第二个参数需要是字符串,不能是csv_reader迭代器,用法完全错误
2. Pandas代码返回空DataFrame
用户代码:
df = pd.read_csv(appcsv_path) out = df[df.Name.str.strip().str.lower().duplicated(keep=False)].loc[0:0] print(out.to_string(index=False))
错误原因:
- CSV实际列名是
name和apptype,代码中错误使用了Name和Type,列名不匹配导致筛选失败 - 额外加了
loc[0:0]强制只取第一行,即使筛选到结果也会被截断为空
正确解决方案
方案一:使用CSV模块手动处理
import csv # 存储每个小写name对应的所有行 name_groups = {} with open('file.csv', 'r', newline='') as csvfile: reader = csv.DictReader(csvfile) # 遍历所有行,按小写name分组 for row in reader: normalized_name = row['name'].strip().lower() if normalized_name not in name_groups: name_groups[normalized_name] = [] name_groups[normalized_name].append(row) # 筛选出分组数量>1的条目,即不区分大小写重复的行 duplicate_rows = [] for group in name_groups.values(): if len(group) > 1: duplicate_rows.extend(group) # 输出结果,保留原始表头和格式 print(f"{reader.fieldnames[0]},{reader.fieldnames[1]}") for row in duplicate_rows: print(f"{row['name']},{row['apptype']}")
方案二:使用Pandas高效处理
import pandas as pd # 读取CSV,注意列名是原始的name/apptype df = pd.read_csv('file.csv') # 生成标准化的小写name列,用于判断重复 df['normalized_name'] = df['name'].str.strip().str.lower() # 标记所有不区分大小写重复的行(keep=False保留所有重复项) is_duplicate = df['normalized_name'].duplicated(keep=False) # 筛选结果并删除辅助列 result_df = df[is_duplicate].drop(columns=['normalized_name']) # 输出结果,去掉索引 print(result_df.to_string(index=False))
内容的提问来源于stack exchange,提问作者ddevalco
相关产品推荐
相关产品推荐

