使用Python csv模块解析含引号内换行符与转义双引号的CSV字符串问题
解决Python csv模块解析含引号内换行和转义双引号的CSV字符串问题
我完全懂你遇到的矛盾——既要正确识别字段内的换行符,又要支持用双引号转义的字段内双引号,之前的配置问题出在对lineterminator和escapechar参数的误用上,下面给你梳理清楚并给出可行的解决方案:
核心问题拆解
lineterminator参数用错了场景:这个参数是给csv.writer设计的,用来指定输出时的行终止符,csv.reader根本不会用它来识别输入的记录分隔符。你手动设置lineterminator='\n'反而干扰了reader的自动解析逻辑,导致它把整个字符串当成了单条记录。escapechar配置不符合你的CSV规范:你的CSV用""表示字段内的单个",这是CSV标准的默认转义方式,不需要设置escapechar——这个参数是用来指定用其他字符(比如反斜杠\)转义双引号的场景,设置它反而会让模块无法正确解析""的转义逻辑。
正确的解析代码示例
import csv from io import StringIO # 你的示例CSV字符串(注意记录之间用\n分隔) result = '"value1";"value2";"value3\nstillvalue3 a ""quote"" inside the quote"\n"value4";"value5";"value6"' # 正确的reader配置 csvreader = csv.reader( StringIO(result), quotechar='"', delimiter=';', quoting=csv.QUOTE_ALL # 明确告知模块所有字段都被引号包裹,可选但能提升解析准确性 ) # 遍历查看解析结果 for row in csvreader: print("解析后的行:", row) print("第三个字段原始内容:", repr(row[2])) # 用repr查看字符串的原始格式
解析结果说明
运行这段代码后,你会得到两条完整的正确记录:
- 第一条记录的第三个字段会完整保留换行符,并且把
""解析为单个",repr(row[2])会输出:'value3\nstillvalue3 a "quote" inside the quote' - 第二条记录会被正确识别为独立的行,不会和第一条混淆
关键配置总结
- 绝对不要给
csv.reader设置lineterminator参数,它会自动处理输入中的各种换行符(包括记录分隔的\n和引号内的换行符) - 当CSV用
""转义字段内双引号时,不要设置escapechar,依赖模块默认的引号转义逻辑即可 - 根据你的CSV格式,正确设置
delimiter(这里是;)和quotechar(这里是"),如果所有字段都被引号包裹,加上quoting=csv.QUOTE_ALL能让解析更可靠
内容的提问来源于stack exchange,提问作者0xCAFEBABE
相关产品推荐
相关产品推荐

