首页 > 解决方案 > 缺少一个标头时强制 read_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

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

PS:与数据框运行同一行

A
1,2,3
4,5,6

将按照我的意愿失败(引发索引错误)。

标签: pythonpandascsv

解决方案


您可以通过参数header=None和省略标题值skiprows=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 commnet 的另一个解决方案:

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)

推荐阅读