我正在尝试使用熊猫read_csv()
读取非结构化的csv文件。问题是某些文件的行中带有多余的列,如示例输入中所示。
样本输入:
col0,col1,col2
a,b,c
a,b,c,d
a,b,c
a,b,c,d
在处理此类文件时,程序会抛出一些ParseError
ParserError: Error tokenizing data. C error: Expected 3 fields in line 3, saw 4
示例输出:
col0 | col1 | col2 | col3
a | b | c | NaN
a | b | c | d
a | b | c | NaN
a | b | c | d
我不想忽略熊猫error_bad_lines = False
中带有read_csv()
参数的行。
任何帮助将不胜感激。
答案 0 :(得分:1)
一个可能的解决方案是先进行预处理并找到最大数量的分隔符,然后通过names
设置参数range
:
path_csv = 'file.csv'
with open(path_csv) as f:
lines = f.readlines()
num = max(l.count(',') for l in lines) + 1
print (num)
4
df = pd.read_csv(path_csv, names=range(num))
print (df)
0 1 2 3
0 col0 col1 col2 NaN
1 a b c NaN
2 a b c d
3 a b c NaN
4 a b c d
如果标头不重要,则可以将其删除:
df = pd.read_csv(path_csv, names=range(num), skiprows=1)
print (df)
0 1 2 3
0 a b c NaN
1 a b c d
2 a b c NaN
3 a b c d
另一个更动态的解决方案是将值添加到标头:
path_csv = 'file.csv'
with open(path_csv) as f:
lines = f.readlines()
#get header to list
header = [x.strip() for x in lines[0].split(',')]
#get max number of separator
max_num = max(l.count(',') for l in lines)
#add missing header values by range
if len(header) < max_num + 1:
header = header + list(range(max_num-len(header) + 1))
print (header)
['col0', 'col1', 'col2', 0]
df = pd.read_csv(path_csv, names=header, skiprows=1)
print (df)
col0 col1 col2 0
0 a b c NaN
1 a b c d
2 a b c NaN
3 a b c d