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 和替换字符字段中的反斜杠。
您可以在此处看到类似的问题:
问题
我有一个竖线分隔的数据集,其中 某些 值中也有竖线。这些元素的两边都用 \
括起来,表示它们之间的管道不应用作分隔符。原始数据如下:
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 和替换字符字段中的反斜杠。
您可以在此处看到类似的问题: