缺少一个标头时,强制read_csv失败

时间:2019-06-20 09:43:28

标签: python pandas csv

我有以下csv:

A,B
1,2,3
4,5,6

我正在运行的 pd.read_csv('file.csv',sep=',', index_col=False)

这为我提供了以下数据框,而忽略了最后一列:

A,B
1,2
4,5

我想要的是熊猫失败(即引发索引错误或解析器错误),因为csv格式不正确(缺少一个标头)。

PS:与数据框在同一行上运行

A
1,2,3
4,5,6

将会失败,并抛出索引错误。

1 个答案:

答案 0 :(得分:3)

您可以通过参数header=Noneskiprows=1省略标头值:

temp=u"""A,B
1,2,3
4,5,6"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), header=None, skiprows=1)
print (df)
   0  1  2
0  1  2  3
1  4  5  6

如果还想替换不存在的值:

c = pd.read_csv(pd.compat.StringIO(temp), nrows=0).columns.tolist()
df.columns = c + df.columns[len(c):].tolist()
print (df)
   A  B  2
0  1  2  3
1  4  5  6

编辑:

temp=u"""A,B
1,2,3
4,5,6"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), header=None, skiprows=1, nrows=1)
#print (df)

c = pd.read_csv(pd.compat.StringIO(temp), nrows=0).columns.tolist()
if len(c) != len(df.columns):
    raise ValueError("The number of columns in header is different thant the number of lines")
else:
    df = pd.read_csv(pd.compat.StringIO(temp))
    print (df)

@Lawis通信的另一种解决方案:

with open('data.csv') as f:
    header = next(f).count(',')
    firstrow = next(f).count(',')
    f.seek(0)

    if header != firstrow:
        raise ValueError("The number of columns in header is 
                           different thant the number of lines")
    else:
        df = pd.read_csv(f)
        print (df)