Python入门问题:按文本模式列表过滤CSV行并写入文件
解决CSV筛选不匹配模式行的问题
嘿,作为Python入门用户,你遇到的这个问题其实很常见——多半是判断逻辑搞反了,或者对CSV的列索引理解错了(毕竟Python是从0开始计数的!)。我来一步步帮你搞定:
先理清核心需求
你要保留的是第2列的值不在指定模式列表里的行(比如原CSV的1、3、5行),所以核心逻辑是:遍历每一行,检查第2列是否不属于模式列表,符合条件就写入新文件。
常见错误点排查
你之前的代码没移除匹配行,大概率是这两个原因之一:
- 把判断条件写反了:用了
row[列索引] in 模式列表(这样会保留匹配的行,而不是排除),应该用not in - 列索引搞错了:你说的“第2列”在Python的csv模块里对应的是索引
1(因为第一列是0),如果写成2就会取到第三列,逻辑自然不对
正确示例代码
我给你写一个完整的、适合入门的示例,用with语句自动管理文件(避免忘记关闭文件的问题):
假设你的模式列表是exclude_patterns = ["value2", "value4"],原CSV文件叫input.csv,要生成的新文件叫output.csv,代码如下:
import csv # 定义需要排除的模式列表(第2列匹配这些值的行会被过滤掉) exclude_patterns = ["value2", "value4"] # 打开原文件和目标文件,用with语句自动处理文件关闭 with open("input.csv", "r", newline="", encoding="utf-8") as infile, \ open("output.csv", "w", newline="", encoding="utf-8") as outfile: # 创建CSV读取器和写入器 reader = csv.reader(infile) writer = csv.writer(outfile) # 遍历每一行 for row in reader: # 检查第2列(索引1)是否不在排除列表中 if row[1] not in exclude_patterns: # 符合条件就写入新文件 writer.writerow(row)
代码解释
newline="":确保CSV文件的换行符在不同系统下都能正确处理encoding="utf-8":避免中文等非ASCII字符出现乱码row[1]:对应你说的“第2列”,因为Python从0开始计数,第一列是row[0],第二列就是row[1]not in:核心判断,确保只有不匹配模式的行才会被写入
测试验证
如果你的input.csv内容是:
行1,value1,数据1 行2,value2,数据2 行3,value3,数据3 行4,value4,数据4 行5,value5,数据5
运行代码后,output.csv里就会保留行1、行3、行5,完全符合你的需求。
额外提示(如果有表头)
如果你的CSV有表头行,想要保留表头的话,只需要先把表头单独写入,再处理数据行:
import csv exclude_patterns = ["value2", "value4"] with open("input.csv", "r", newline="", encoding="utf-8") as infile, \ open("output.csv", "w", newline="", encoding="utf-8") as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 读取并写入表头行 header = next(reader) writer.writerow(header) # 处理数据行 for row in reader: if row[1] not in exclude_patterns: writer.writerow(row)
这样就能完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者user3447273
相关产品推荐
相关产品推荐

