如何仅修改CSV文件每行第三列内容,解决_csv.writer不可迭代报错
问题原因分析
- 错误
builtins.TypeError: '_csv.writer' object is not iterable的直接原因是csv.writer是仅用于写入的工具对象,不支持遍历迭代,你无法通过for line in writer读取原有文件内容 - 原有代码存在逻辑错误:一开始就用
w模式打开CSV文件,会直接清空文件所有原有内容,根本无法读取原来的前两列数据 - 写入行的代码里把
line[0]、line[1]加了引号,会直接写入固定字符串而不是原行列的实际值,也不符合需求
优化实现方案
方案1:小文件场景(全量读取修改后回写,实现简单)
import csv new_age = "25" # 第一步:读取原文件所有内容 rows = [] with open('friends.csv', mode='r', encoding='utf-8') as read_file: reader = csv.reader(read_file, delimiter=';', quotechar='"') for row in reader: # 保证行至少有3列再修改,避免索引报错 if len(row) >= 3: row[2] = new_age rows.append(row) # 第二步:把修改后的内容写回原文件 with open('friends.csv', mode='w', encoding='utf-8', newline='') as write_file: writer = csv.writer(write_file, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL) writer.writerows(rows)
方案2:大文件场景(逐行读写避免占满内存,安全性更高)
import csv import os new_age = "25" # 先写入临时文件,避免中途出错损坏原文件 with open('friends.csv', mode='r', encoding='utf-8') as read_file, \ open('friends_temp.csv', mode='w', encoding='utf-8', newline='') as write_file: reader = csv.reader(read_file, delimiter=';', quotechar='"') writer = csv.writer(write_file, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL) for row in reader: if len(row) >= 3: row[2] = new_age writer.writerow(row) # 用修改完成的临时文件替换原文件 os.replace('friends_temp.csv', 'friends.csv')
注意事项
- 如果CSV文件包含表头不需要修改第三列,可以在遍历第一行时直接跳过修改逻辑
- 写入时新增
newline=''参数是为了避免Windows系统下写入CSV出现多余空行的问题 - 大文件推荐使用临时文件方案,即使写入中途异常也不会损坏原文件数据
内容的提问来源于stack exchange,提问作者Mirek6
相关产品推荐
相关产品推荐

