Python CSV Writer字段内换行问题:如何避免生成多余换行?
解决Python csv模块字段内换行问题
你遇到的问题本质是:newline=''参数的作用是控制CSV文件行与行之间的结束符,避免系统自动添加多余换行,它不会处理字段内部的\n。而CSV格式规范要求:包含换行、分隔符等特殊字符的字段必须用引号包裹,并且保留字段内的换行。要避免字段内生成实际换行,有两种可行方案:
方案1:预处理数据,替换字段内的换行符
直接把数据中字段里的\n替换成你需要的字符(比如空格、转义字符串\\n),再写入CSV。
示例代码:
import csv field_names = ['id', 'number', 'scope'] data_rows = [ {'id': 100001, 'number': 'a01', 'scope': 'row1 test \nrow1 test \nrow1 test'}, {'id': 100002, 'number': 'a02', 'scope': 'row2 test \nrow2 test \nrow2 test'} ] # 预处理:将字段内的换行符替换为空格(可根据需求换成\\n转义符) for row in data_rows: row['scope'] = row['scope'].replace('\n', ' ') tbl_name = 'testnewlines' with open(f"{tbl_name}.csv", 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=field_names, delimiter='|') writer.writeheader() writer.writerows(data_rows)
生成的CSV内容:
id|number|scope 100001|a01|row1 test row1 test row1 test 100002|a02|row2 test row2 test row2 test
方案2:自定义csv写入的引号处理(进阶)
如果你需要保留\n的字符语义但不显示为实际换行,可以通过自定义csv.QUOTE_NONE并手动转义,但这种方式需要确保字段内没有分隔符,否则会破坏CSV格式:
示例代码:
import csv field_names = ['id', 'number', 'scope'] data_rows = [ {'id': 100001, 'number': 'a01', 'scope': 'row1 test \nrow1 test \nrow1 test'}, {'id': 100002, 'number': 'a02', 'scope': 'row2 test \nrow2 test \nrow2 test'} ] # 预处理:转义换行符 for row in data_rows: row['scope'] = row['scope'].replace('\n', '\\n') tbl_name = 'testnewlines' with open(f"{tbl_name}.csv", 'w', newline='', encoding='utf-8') as f: # 设置QUOTE_NONE,不自动添加引号 writer = csv.DictWriter(f, fieldnames=field_names, delimiter='|', quoting=csv.QUOTE_NONE) writer.writeheader() writer.writerows(data_rows)
生成的CSV内容:
id|number|scope 100001|a01|row1 test \nrow1 test \nrow1 test 100002|a02|row2 test \nrow2 test \nrow2 test
注意:使用QUOTE_NONE时,必须确保所有字段内不包含分隔符(这里是|),否则会导致CSV解析错误。
内容的提问来源于stack exchange,提问作者Eliseo Di Folco
相关产品推荐
相关产品推荐

