Python csv.writer写入CSV出现多余字符问题及解决方法
Python CSV处理:删除指定行后写入格式错误的解决办法
问题场景
我写了个Python脚本读取CSV文件,把内容存进数组后删除第二行,再写回CSV。但写完后文件里多出了'、]这类字符,多次运行引号还会越来越多。
原始CSV内容
first name,username,age,status test1,test1_username,28,2023-08-18 13:41:10+00:00 test2,test2_username,28,2023-08-18 13:41:10+00:00 test3,test3_username,28,2023-08-18 13:41:10+00:00 test4,test4_username,28,2023-08-18 13:41:10+00:00 test5,test5_username,28,2023-08-18 13:41:10+00:00 test6,test6_username,28,2023-08-18 13:41:10+00:00 test7,test7_username,28,2023-08-18 13:41:10+00:00 test8,test8_username,28,2023-08-18 13:41:10+00:00
错误输出结果
first name,username,age,status test2', 'test2_username', '28', '2023-08-18 13:41:10+00:00']] test3', 'test3_username', '28', '2023-08-18 13:41:10+00:00']] test4', 'test4_username', '28', '2023-08-18 13:41:10+00:00']] test5', 'test5_username', '28', '2023-08-18 13:41:10+00:00']] test6', 'test6_username', '28', '2023-08-18 13:41:10+00:00']] test7', 'test7_username', '28', '2023-08-18 13:41:10+00:00']] test8', 'test8_username', '28', '2023-08-18 13:41:10+00:00']]
期望输出结果
first name,username,age,status test2,test2_username,28,2023-08-18 13:41:10+00:00 test3,test3_username,28,2023-08-18 13:41:10+00:00 test4,test4_username,28,2023-08-18 13:41:10+00:00 test5,test5_username,28,2023-08-18 13:41:10+00:00 test6,test6_username,28,2023-08-18 13:41:10+00:00 test7,test7_username,28,2023-08-18 13:41:10+00:00 test8,test8_username,28,2023-08-18 13:41:10+00:00
原代码
data = [] rows = [] with open('list.csv', 'r', encoding='UTF-8') as f: data = csv.reader(f,delimiter=",",lineterminator="\n") for row in data: rows.append([row,]) rows = rows[2:] with open('list.csv', 'w', encoding='UTF-8') as g: writer = csv.writer(g, delimiter="\n") writer2 = csv.writer(g, lineterminator="\n") writer2.writerow(['first name', 'username', 'age', 'status'])
错误原因分析
- 读取时的嵌套列表错误:原代码里
rows.append([row,])把每行(本身就是列表)又包了一层嵌套列表,变成[[row1], [row2], ...],后续写入时csv模块会把这种嵌套结构转成带引号和方括号的字符串,就出现了'和]。 - 写入器配置错误:创建了两个csv.writer,而且第一个把
delimiter设成了\n——delimiter是CSV字段之间的分隔符,应该用逗号,改成换行符会彻底打乱格式;另外原代码只写了表头,没把处理后的rows内容写进去。 - 行索引处理错误:
rows = rows[2:]直接从第三行开始取,把表头也删掉了,之后又手动写表头,逻辑混乱。
修复后的代码
import csv # 读取CSV文件 rows = [] with open('list.csv', 'r', encoding='UTF-8') as f: reader = csv.reader(f) rows = list(reader) # 删除第二行(索引为1的行,也就是test1那一行) if len(rows) > 1: rows.pop(1) # 写回CSV文件 with open('list.csv', 'w', encoding='UTF-8', newline='') as g: writer = csv.writer(g) writer.writerows(rows)
代码说明
- 读取时直接把reader转成列表,每行就是一个普通列表,没有多余嵌套。
- 用
rows.pop(1)精准删除第二行(表头是索引0,要删的test1行是索引1),保留表头和后续行。 - 写入时只用一个csv.writer,
newline=''避免Windows下出现多余空行,用writerows一次性写入所有行,格式完全符合CSV规范。
内容的提问来源于Stack Exchange,提问作者Santos
相关产品推荐
相关产品推荐

