Python中修改csv.DictReader字段名后如何正确生成新CSV
问题:CSV表头重命名时旧表头被当作数据行写入
原始CSV文件(oldFile.csv)
oldHeader1,oldHeader2,oldHeader3 data01,data02,data03 data11,data12,data13 data21,data22,data23
尝试的代码
import csv with open("oldFile.csv", "r") as input: reader = csv.DictReader(input, delimiter=",") reader.fieldnames = ["newHeader1", "newHeader2", "newHeader3"] rows = list(reader) with open("newFile.csv", "w", newline="") as output: writer = csv.DictWriter(output, fieldnames=reader.fieldnames, delimiter=",") writer.writeheader() for row in rows: writer.writerow(row)
问题现象
运行后生成的newFile.csv把旧表头当成了数据行:
newHeader1,newHeader2,newHeader3 oldHeader1,oldHeader2,oldHeader3 data01,data02,data03 data11,data12,data13 data21,data22,data23
测试验证
单独测试csv.DictReader能正确识别旧表头:
import csv with open("oldFile.csv", "r") as input: reader = csv.DictReader(input, delimiter=",") print(reader.fieldnames)
输出:
['oldHeader1', 'oldHeader2', 'oldHeader3']
疑问:明明修改了fieldnames,为什么旧表头还是会被写入?不想用rows = list(reader)[1:]这种切片方式,求正确实现方法。
解决方案
问题原因
csv.DictReader初始化时已经自动读取了文件第一行作为表头,后续修改reader.fieldnames只是改变了后续数据行的键名映射,但已经被读取的旧表头行,会被当成第一行数据来处理——因为DictReader的表头读取步骤已经完成,修改fieldnames不会回溯跳过这一行。
正确实现方法
方法一:手动跳过旧表头,用新表头初始化DictReader
import csv with open("oldFile.csv", "r") as input: # 先读取并跳过旧表头行 input.readline() # 直接用新表头创建DictReader,后续行自动按新表头映射 reader = csv.DictReader(input, fieldnames=["newHeader1", "newHeader2", "newHeader3"], delimiter=",") rows = list(reader) with open("newFile.csv", "w", newline="") as output: writer = csv.DictWriter(output, fieldnames=["newHeader1", "newHeader2", "newHeader3"], delimiter=",") writer.writeheader() writer.writerows(rows)
方法二:用普通csv.reader处理(更直观)
import csv with open("oldFile.csv", "r") as input: reader = csv.reader(input, delimiter=",") # 跳过旧表头 next(reader) rows = list(reader) with open("newFile.csv", "w", newline="") as output: writer = csv.writer(output, delimiter=",") # 写入新表头 writer.writerow(["newHeader1", "newHeader2", "newHeader3"]) # 写入所有数据行 writer.writerows(rows)
这两种方法都能直接跳过旧表头,不需要切片操作,确保新文件只包含新表头和原始数据行。
内容的提问来源于stack exchange,提问作者deltonio2
相关产品推荐
相关产品推荐

