
理解 pandas.read_csv 的默认解析行为
在数据处理中,CSV文件是最常见的数据格式之一。Pandas库通过其强大的read_csv函数提供了便捷的CSV文件读取能力。然而,当CSV文件中包含特殊字符,特别是字段内包含分隔符或引号时,read_csv的默认行为可能会导致非预期的解析结果。
考虑以下一个简单的CSV文件 mycsv.csv,其中只有一行两列,且没有标题:
"1,6 Engine DCT 18\"","1,6 Engine Luxury DCT"
我们期望通过Pandas读取后得到一个包含两列的DataFrame: | 0 | 1 | |---|---| | 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" |
这种非预期的分割结果源于read_csv的默认参数设置,特别是quotechar(引用字符)和doublequote(双引号处理)。
默认参数解析逻辑:
- sep=',': 逗号被识别为字段分隔符。
- quotechar='"': 双引号被识别为字段引用字符,用于包裹包含分隔符的字段。
- doublequote=True (默认值): 当quotechar被指定且doublequote为True时,如果字段内部需要表示一个字面量的引用字符,则需要使用两个连续的引用字符(例如""代表一个")。
- escapechar=None (默认值): 默认情况下没有指定转义字符。
根据这些默认设置,我们来分析字符串 "1,6 Engine DCT 18\"","1,6 Engine Luxury DCT" 的解析过程:
- 第一个字段开始: 遇到第一个",Pandas开始解析第一个字段。
- 读取内容: 读取到 1,6 Engine DCT 18。
-
遇到 \": 这是问题的核心。
- 由于escapechar为None,\不被视为转义字符。
- 由于doublequote=True,Pandas期望通过""来表示字段内部的字面量"。而此处是\",不符合""的模式。
- 因此,\被视为普通字符,"也被视为普通字符(即字面量\和字面量")。
- 此时,Pandas认为第一个字段的引用并未结束,因为它没有遇到匹配的关闭引用(")或者符合doublequote=True规则的""。
- 遇到 ,: 由于字段仍被认为是开放的,这个逗号被视为字段内容的一部分,而非分隔符。
- 读取 1: 1也被视为字段内容的一部分。
- 遇到下一个 ": 这个"是第一个在打开引用后,不被视为内部字面量(因为不是""模式)且能作为关闭引用的字符。因此,Pandas将其识别为第一个字段的结束。
- 第一个字段解析结果: 1,6 Engine DCT 18\",1。
- 第二个字段开始: 紧接着上一个字段的关闭引用,下一个逗号,被识别为分隔符。
-
解析第二个字段: 剩余的字符串是 ,"1,6 Engine Luxury DCT"。由于第一个字段已经消耗了1,,实际用于第二个字段的输入是"6 Engine Luxury DCT"。
- 遇到",开始解析第二个字段。
- 读取 6 Engine Luxury DCT。
- 遇到最后一个",关闭第二个字段。










