Python pandas读取CSV仅能访问第一列报KeyError解决方案
问题原因
触发KeyError的核心原因是列名存在不可见的多余字符:从打印的DataFrame输出能看到列名视觉上有缩进对齐,说明第二、第三列的列名前后大概率夹带了空格、制表符这类不可见空白(通常是CSV生成时,分隔符逗号后自带的多余空格,或是文件BOM头残留)。第一列作为首列没有附带多余字符,所以可以正常匹配访问,后两列的实际列名和你手写的'Signal/nA'、'Ref.signal/nA'字符串不完全一致,就会触发键不存在的报错。
快速排查方法
读取数据后执行以下代码,打印列名的原始字符串表示,就能直接看到隐藏的多余字符:
print([repr(col) for col in df.columns])
正常情况下你会看到输出类似['Time_abs/ps', ' Signal/nA', ' Ref.signal/nA'],能明确看到后两列名前多了前置空格。
可行解决方案
- 读取时自动处理分隔符旁空格:调用
read_csv时加入skipinitialspace=True参数,自动跳过分隔符后附带的多余空格,从读取阶段就避免列名带空白的问题,修改后的读取代码:
df = pd.read_csv(io.BytesIO(uploaded['wf air.csv']), skipinitialspace=True)
- 读取后批量清理列名空白:如果不想修改读取参数,读完数据后直接对所有列名做前后空白裁剪,一行代码即可修复:
df.columns = df.columns.str.strip()
- 位置索引绕开列名匹配:如果不需要匹配列名,直接按列的位置取数即可,完全不受列名隐藏字符影响:第二列用
df.iloc[:, 1],第三列用df.iloc[:, 2]。 - BOM头异常修复:如果排查发现列名首字符是
\ufeff这类BOM残留,读取时指定编码为utf-8-sig即可自动清除异常头:
df = pd.read_csv(io.BytesIO(uploaded['wf air.csv']), encoding='utf-8-sig')
内容的提问来源于stack exchange,提问作者Andrew Fitzgerald
相关产品推荐
相关产品推荐

