我需要能够使用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')
我对正则表达式做错了吗?
答案 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开始)。