Pandas read_csv 处理字段数不匹配与 KeyError 报错详解
本文详解Pandas中read_csv读取CSV文件时常见的两类错误:因字段数不匹配导致的ParserError及KeyError。通过设置error_bad_lines=False跳过异常行,并区分Series与DataFrame赋值差异,提供针对EOF字符串错误及类型比较错误的实用解决方案。
处理字段数不匹配的ParserError
在使用Pandas读取CSV文件时,若某行数据的列数与表头定义的列数不一致,程序通常会抛出异常。如果确认这些报错行可以安全忽略,可以通过添加特定参数来跳过它们。
具体配置方式如下:
pandas.read_csv(***,error_bad_lines=False)
调用 pandas.read_csv(filePath) 读取CSV文件时,常会遭遇如下报错信息:
ParserError:Error tokenizing data.C error:Expected 2 fields in line 407,saw 3.
该错误提示表明,在CSV文件的第407行,程序预期读取2个字段,但实际解析到了3个字段。
造成此问题的原因通常是:CSV文件的表头(header)仅定义了两个字段名,而第407行数据中包含了额外的逗号分隔符,或者该行确实包含三个数据部分,导致Pandas无法正确对齐字段。
解决思路有两种:一是手动修正CSV文件,删除第407行多余的字段;二是在调用read_csv时通过设置参数 error_bad_lines=False 来忽略此类解析错误。
修改后的代码示例如下:
pandas.read_csv(filePath,error_bad_lines=False)
通过上述设置,程序将自动跳过那些因格式错乱(如多余逗号导致列数增加)而报错的行,继续读取其余有效数据。
排查与解决KeyError错误
另一种常见错误是 KeyError,具体表现如下:
出现此类错误通常是因为代码中引用了DataFrame中不存在的列名(例如 'id' 字段)。可能的原因包括:
CSV文件的表头部分未正确识别逗号分隔符,导致所有列被合并为一列。此时,可通过 df.columns.values 查看当前DataFrame实际包含的列名:
print(df.columns.values)
或者在操作DataFrame的过程中,意外丢失了 'id' 字段的表头信息且未察觉。
一个典型的错误操作示例如下:
df=df[df['id']!='null']#取得id字段不为null的行 df=df['id']#赋值后df为Series,表示df在id列的值,而不再是一个DataFrame,于是丢掉了id的头,此时若再使用df['id']将报错。
需要明确区分“获取列的值”与“保留列结构”的区别:
df=df['id']#取id列的值,赋值后df为Series类型,可用print(type(df))来查看其类型 df=df[['id']]#只取df的id列作为一个新的DataFrame,赋值后df仍然是一个DataFrame df=df[['id','age']]#取df的id和age列作为一个新的DataFrame,赋值后df仍然是一个DataFrame
关于行过滤操作的注意事项:
df=df[df['id']!='null']#过滤掉id字段取值为'null'的行
需注意,此处比较的 'null' 是字符串类型。如果df中某行 'id' 字段的实际值不是字符串类型,或者为None/空值,直接比较会引发 TypeError:invalid type comparison 错误,因为Python要求比较操作数类型一致。
解决方法:如果无法保证 'id' 列所有数据均为字符串类型,应移除该过滤条件,或先进行类型转换后再进行比较。
解决EOF inside string错误
补充知识:使用Pandas的read_csv读取文件时,有时会遇到如下错误:EOF inside string starting at line
解决方法:通过调整 quoting 参数来处理包含引号的字符串数据。
df = pd.read_csv(csvfile, header = None, delimiter="\t", quoting=csv.QUOTE_NONE, encoding='utf-8')
以上关于Pandas read_csv处理跳过报错行及常见错误的解决方案供参考,希望能帮助读者解决数据读取中的实际问题。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









