Pandas默认读取含特殊字符CSV的字段拆分逻辑疑问
问题场景
有一个仅一行两列、无表头的CSV文件,实际存储内容为:
"1,6 Engine DCT 18\"","1,6 Engine Luxury DCT"
期望读取后得到一行两列的表格,其中第一列是1,6 Engine DCT 18",第二列是1,6 Engine Luxury DCT。但执行默认读取代码:
pandas.read_csv("mycsv.csv", header=None, sep=",")
得到的拆分结果不符合预期:
| 0 | 1 |
|---|---|
| 1,6 Engine DCT 18",1 | 6 Engine Luxury DCT" |
核心原因分析
Pandas 2.0.1的read_csv默认参数组合,导致了这种异常拆分:
默认不将反斜杠视为转义字符:
默认escapechar=None,CSV中的\只是普通文本字符,不会被用来转义后续的"。因此文件里的\"会被解析成两个独立字符:\和"。双引号转义遵循CSV标准规则:
默认doublequote=True,这是CSV的标准转义逻辑——如果字段内需要包含双引号,必须用两个连续的双引号(例如"1,6 Engine DCT 18""","..."),而非反斜杠加双引号。该CSV使用的\"不符合默认转义规则,解析器无法识别这是字段内的引号。QUOTE_MINIMAL模式的结束判断逻辑:
默认quoting=csv.QUOTE_MINIMAL,解析器仅在引号紧跟分隔符或行尾时,才判定该引号为字段结束标志。
回到目标CSV行:第一个字段的"后紧跟的是","(逗号+双引号),不是单纯的分隔符逗号,因此解析器不认为这是第一个字段的结束,会持续读取后续字符,直到遇到第二个字段中1,6的逗号,才将这个逗号当作分隔符拆分字段。
最终导致第一个字段包含了1,6 Engine DCT 18\"和后续的,1,第二个字段从6开始直到行尾的"。
正确读取方式
指定quotechar='"'和escapechar="\\",让解析器识别反斜杠为转义字符,正确处理字段内的\":
pandas.read_csv("mycsv.csv", header=None, sep=",", quotechar='"', escapechar="\\")
内容的提问来源于stack exchange,提问作者Csaba

