如何使用Python删除CSV文件中不在指定ID列表内的多余行
问题分析与修正方案
原代码存在以下缺陷:
- 类型不匹配:
l_id存储的是整数类型,从CSV行拆分得到的ID为字符串类型,直接做集合判断永远无法正确匹配 - 匹配逻辑不严谨:直接对整行拆分后做集合判断,若
Name列出现和目标ID相同的数值会出现误判,没有精准匹配ID列 - 读写逻辑不规范:使用
csv.writer写文件,但读文件没有使用配套的csv.reader解析,直接传入字符串写行会导致CSV格式错乱 - 表头丢失风险:没有单独处理首行表头,会被当做普通行判断过滤
修正后的实现方案
方案1:使用标准csv模块实现(无需额外安装依赖)
import csv l_id = [18850080, 535553, 19292162, 1728035, 1179719, 19194894, 22817838, 19997487, 19728145, 1457232, 13560402, 18855476, 7151442, 18955830, 11294262, 18506072, 1360698] # 转换为字符串集合,加快匹配速度同时适配CSV读取的字符串类型ID valid_id_set = set(map(str, l_id)) with open('abc.csv', 'r', newline='', encoding='utf-8') as inp, open('abc_edit.csv', 'w', newline='', encoding='utf-8') as out: reader = csv.DictReader(inp) writer = csv.DictWriter(out, fieldnames=reader.fieldnames) # 写入表头 writer.writeheader() # 逐行判断ID是否在有效列表中 for row in reader: if row['ID'] in valid_id_set: writer.writerow(row)
该方案精准匹配ID列,不会出现误匹配问题,同时保留原CSV表头和格式。
方案2:使用pandas实现(代码更简洁,适合大文件处理)
import pandas as pd l_id = [18850080, 535553, 19292162, 1728035, 1179719, 19194894, 22817838, 19997487, 19728145, 1457232, 13560402, 18855476, 7151442, 18955830, 11294262, 18506072, 1360698] df = pd.read_csv('abc.csv') # 筛选ID在l_id中的行 df_filtered = df[df['ID'].isin(l_id)] # 保存结果,不写入自带的索引列 df_filtered.to_csv('abc_edit.csv', index=False)
该方案仅需3行核心代码即可完成需求,处理效率更高。
内容的提问来源于stack exchange,提问作者abc xyz
相关产品推荐
相关产品推荐

