pandas.read_csv() 带分隔符和引号

pandas.read_csv() with delimiter and quotechar

问题

我有一个竖线分隔的数据集,其中 某些 值中也有竖线。这些元素的两边都用 \ 括起来,表示它们之间的管道不应用作分隔符。原始数据如下:

Col1|Col2|Col3
1|some text|more text
2|some text|more text
3|\text with a | in it\|more text
4|\a|b|c\|more text

我想将这些读入 pandas 数据框,使其看起来像:

Col1 Col2 Col3
1 some text more text
2 some text more text
3 text with a | in it more text
4 a|b|c more text

尝试 1

如果我只用

pd.read_csv(path, sep='|')

我收到错误

---------------------------------------------------------------------------
ParserError                               Traceback (most recent call last)
...
pandas/_libs/parsers.pyx in pandas._libs.parsers.raise_parser_error()
ParserError: Error tokenizing data. C error: Expected 3 fields in line 3, saw 4

因为引擎将第 3 行解释为有 4 列。

尝试 2

我认为这可以使用 quotechar 参数 (reference to docs)

来解决
pd.read_csv(path, sep='|', quotechar='\')

但这会将值保留为 NaN 而不是正确解析

Col1 Col2 Col3
1 some text more text
2 some text more text
3 NaN more text
4 NaN more text

尝试 3

我尝试使用 comment 参数(虽然我认为这不是它的预期用途并且得到了与尝试 2 相同的结果。

pd.read_csv(path, sep='|', comment='\')

不幸的是,“quotechar”参数被限制为 一个 个字符。在你的情况下你有两个。

你可以做的是预处理文件内容以用另一个字符替换 \,例如规范的双引号 "

import io

path = 'test.csv'

with open(path) as f:
    df = pd.read_csv(io.StringIO(f.read().replace(r'\', '"')), sep='|')

print(df)

输出:

                  Col1       Col2  Col3
1            some text  more text   NaN
2            some text  more text   NaN
3  text with a | in it  more text   NaN
4                a|b|c  more text   NaN

注意。除了 header 之外,每一行的末尾都有一个额外的 |,这是预期的吗?

quotechar='\' 对您不起作用的原因是因为 quotechar 假定任何长度超过一个字符的参数都是正则表达式。

我会尝试用一个反斜杠替换那个双反斜杠。也许试试这样的事情:

from io import StringIO
import pandas as pd

doubleslash = r"\"

with open("test.csv", newline="") as f:
    file = StringIO(f.read().replace(doubleslash, "\"))
    frame = pd.read_csv(file, delimiter="|", quotechar="\")

print(frame)

请注意,我们必须将双反斜杠定义为原始字符串,并且我们要转义 quotechar 和替换字符字段中的反斜杠。

您可以在此处看到类似的问题: