我有以下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
将会失败,并抛出索引错误。
答案 0 :(得分:3)
您可以通过参数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通信的另一种解决方案:
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)