我有一个 csv 文件,其值以逗号分隔。 纯文本的列值之一输入为
"XATO,2xASSY,SSD, 6.4TB Gen2, SFF-2.5"", N"
应该放在双引号内,这样值内的逗号就不会被误认为分隔符。
当我执行
pd.read_csv
然后打印这个值时,我得到了
XATO,2xASSY,SSD, 6.4TB Gen2, SFF-2.5"
结果。这正是我需要的,但我似乎无法理解解释逻辑,有人可以解释一下吗?
Pandas 正在寻找双引号字符"
之间的
最长引用区域。
也就是说,当 Pandas 遇到作为字段开头候选的
"
时,它会向右搜索匹配的 "
来关闭该字段。然而,当它第一次遇到第二个"
时,它不会立即关闭场。相反,它会搜索 "
的 outermost实例,后跟空格和另一个字段分隔符
,
,或行尾。
请注意,此行为也会受到
doublequote=
kwarg(默认为 True
)和 quoting=
kwarg(默认为 csv.QUOTE_MINIMAL
)的影响。
使用
doublequote=False
和 quoting=csv.QUOTE_MINIMAL
,输入 "XATO,2xASSY,SSD, 6.4TB Gen2, SFF-2.5""""""", N"
产生输出 XATO,2xASSY,SSD, 6.4TB Gen2, SFF-2.5""""""
和 N"
。除了最右边的所有 "
都被视为字段内容的一部分。
相比之下,
"XATO,2xASSY,SSD, 6.4TB Gen2, SFF-2.5"","""""", N"
解析为三列,XATO,2xASSY,SSD, 6.4TB Gen2, SFF-2.5"
、"""
和 N"
。
表示为正则表达式,其行为在概念上类似于
"(.*?)"(?:,|$)
,其中字段内容本身是第一个捕获组。到底是通过回溯还是其他方式来实现的,我不知道。您必须检查源代码。当然,实际行为比您想要尝试用普通正则表达式表达的行为要复杂得多。
使用
csv.QUOTENONE
:
import csv
import pandas as pd
df = pd.read_csv('mycsv.csv', quoting=csv.QUOTE_NONE)
或者只使用号码
3
:
import pandas as pd
df = pd.read_csv('mycsv.csv', quoting=3)
推理:
正如 Pandas 文档 here 中提到的,
pd.read_csv
将 ,
(逗号)作为默认分隔符,因此 pd.read_csv
函数正在 csv 文件的行中查找逗号,一旦函数找到逗号,它向该行添加一个新元素。