具有多个分隔符的熊猫read_csv不起作用

时间:2020-02-22 05:59:02

标签: pandas csv

我需要能够使用read_csv解析2种不同类型的CSV,第一种具有;分隔的值,第二种具有,分隔的值。我需要同时这样做。

也就是说,CSV可以具有以下格式:

some;csv;values;here

或者这个:

some,csv,values,here

甚至是混合的:

some;csv,values;here

我尝试了很多类似以下正则表达式的操作,但没有任何效果:

data = pd.read_csv(csv_file, sep=r'[,;]', engine='python')

我对正则表达式做错了吗?

1 个答案:

答案 0 :(得分:2)

我运行了您的代码示例,而不是从文件中读取 从字符串中读取:

txt = '''C1;C2,C3;C4
some;csv,values;here
some1;csv1,values1;here1'''
data = pd.read_csv(io.StringIO(txt), sep='[,;]', engine='python')

并获得了正确的结果:

      C1    C2       C3     C4
0   some   csv   values   here
1  some1  csv1  values1  here1

请注意, sep 参数甚至可以是普通(不是 raw )字符串, 因为它不包含任何反斜杠。

因此您可以将多个分隔符指定为正则表达式模式。

您的代码失败的原因可能是“不一致”的划分 行成字段。也许您应该确保每行包含 相同数量的逗号和分号(至少不要太多)。

仔细查看堆栈跟踪。那里应该包括一些信息 关于源文件的哪一行导致了问题。 然后查看指示的行并进行更正。

编辑

要查看“失败案例”中发生的情况,我将源字符串更改为:

txt = '''C1;C2,C3;C4
some;csv,values;here
some1;csv1,values1;here1
some2;csv2,values2;here2,xxxx'''

即我在 5 个字段中添加了一行(太多了)。

然后执行上面的代码将导致错误消息:

ParserError: Expected 4 fields in line 4, saw 5. ...

第4行中的注释字词,恰好表示有问题的输入行 (行号从1开始)。