Python 3.3中如何删除DictReader对象中的行?
解决csv.DictReader无法删除行的问题
嗨,我来帮你搞定这个问题!你碰到的报错完全在意料之中——csv.DictReader本质是迭代器,它的设计目的只是按顺序读取CSV内容,并不支持像列表那样直接删除或修改其中的元素。
为什么不能直接删?
DictReader会逐行读取文件,每读一行就生成一个字典,读取后不会把所有内容都存在内存里,所以它从一开始就没有提供删除行的接口,也就出现了the dictReader object does not support item deletion这个报错。
两种可行的解决方案
方案1:先把所有行读进内存,过滤后再写入(适合小文件)
这种方法简单直观,先把CSV的所有内容(包括表头)存到列表里,然后过滤掉不需要的行,最后写入新文件:
import csv # 1. 读取所有行到内存 with open("your_input.csv", "r", newline="") as infile: reader = csv.DictReader(infile, delimiter=";") fieldnames = reader.fieldnames # 保存表头 all_rows = list(reader) # 把迭代器转成列表,方便操作 # 2. 过滤行:保留符合条件的(相当于删除不符合的) # 把下面的判断替换成你的实际条件,比如删除"age"列大于30的行 filtered_rows = [row for row in all_rows if int(row["age"]) <= 30] # 3. 写入过滤后的内容到新文件 with open("your_output.csv", "w", newline="") as outfile: writer = csv.DictWriter(outfile, fieldnames=fieldnames, delimiter=";") writer.writeheader() # 写入表头 writer.writerows(filtered_rows) # 写入所有符合条件的行
方案2:逐行读取并写入(适合大文件,节省内存)
如果你的CSV文件很大,全部读进内存会占用太多资源,可以边读边写,只保留需要的行:
import csv with open("your_input.csv", "r", newline="") as infile, open("your_output.csv", "w", newline="") as outfile: reader = csv.DictReader(infile, delimiter=";") writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames, delimiter=";") writer.writeheader() # 先写入表头 # 逐行处理:符合条件的才写入 for row in reader: # 替换成你的判断条件,比如保留"status"为"active"的行 if row["status"] == "active": writer.writerow(row)
注意事项
- 建议先备份原文件,避免操作失误导致数据丢失
- 如果需要覆盖原文件,可以在过滤完成后,用新文件替换原文件(或者先删除原文件再重命名新文件)
内容的提问来源于stack exchange,提问作者bashfix
相关产品推荐
相关产品推荐

