python - 缺少一个标头时强制 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
将按照我的意愿失败(引发索引错误)。
解决方案
您可以通过参数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)