Python如何基于单列匹配删除两个CSV不匹配行且不合并文件
实现思路
- 全程不合并两个CSV文件,仅先提取两个文件A列的公共取值集合
- 分别对两个文件做行过滤,仅保留A列取值在公共集合内的行
- 过滤完成后分别写回对应文件即可
实现代码
基于pandas的简洁实现
该方案代码量最小,先执行pip install pandas安装依赖后即可运行:
import pandas as pd # 读取两个CSV文件,sep参数和实际文件分隔符保持一致 df_a = pd.read_csv("a.csv", sep='\t') df_b = pd.read_csv("b.csv", sep='\t') # 计算两个文件A列的取值交集 common_a_set = set(df_a['A']).intersection(set(df_b['A'])) # 分别过滤两个文件的非匹配行 df_a_filtered = df_a[df_a['A'].isin(common_a_set)] df_b_filtered = df_b[df_b['A'].isin(common_a_set)] # 写回原文件,不生成合并文件 df_a_filtered.to_csv("a.csv", index=False, sep='\t') df_b_filtered.to_csv("b.csv", index=False, sep='\t')
基于Python标准库的零依赖实现
如果不想安装第三方库,可以直接用Python自带的csv模块实现:
import csv # 第一步:分别收集两个文件的A列取值 a_values = set() b_values = set() with open("a.csv", "r", newline="", encoding="utf-8") as f: reader = csv.DictReader(f, delimiter='\t') for row in reader: # 如果A列是字符串类型,去掉int()转换即可 a_values.add(int(row['A'])) with open("b.csv", "r", newline="", encoding="utf-8") as f: reader = csv.DictReader(f, delimiter='\t') for row in reader: b_values.add(int(row['A'])) # 计算A列交集 common_a = a_values & b_values # 过滤并写回a.csv filtered_a = [] with open("a.csv", "r", newline="", encoding="utf-8") as f: reader = csv.DictReader(f, delimiter='\t') headers = reader.fieldnames for row in reader: if int(row['A']) in common_a: filtered_a.append(row) with open("a.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=headers, delimiter='\t') writer.writeheader() writer.writerows(filtered_a) # 过滤并写回b.csv filtered_b = [] with open("b.csv", "r", newline="", encoding="utf-8") as f: reader = csv.DictReader(f, delimiter='\t') headers = reader.fieldnames for row in reader: if int(row['A']) in common_a: filtered_b.append(row) with open("b.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=headers, delimiter='\t') writer.writeheader() writer.writerows(filtered_b)
注意事项
- 代码中
sep/delimiter参数需要和你实际CSV文件的列分隔符匹配:你给出的示例文件是制表符分隔,所以默认填了\t;如果是逗号分隔的常规CSV,改成','即可。 - 如果A列存储的是字符串而非数字,删掉代码中
int()类型转换的逻辑,直接用原始字符串做集合比对,避免类型不匹配导致匹配失败。 - 建议运行代码前先备份两个原CSV文件,防止写回操作失误导致数据丢失。
内容的提问来源于stack exchange,提问作者RKIDEV
相关产品推荐
相关产品推荐

