pandas.read_csv()报错主因是默认严格解析csv规范,解决方法包括:①用on_bad_lines='skip'(新版)或error_bad_lines=false(旧版)跳过异常行;②设quoting=csv.quote_none配合engine='python'禁用引号解析;③逐块读取+csv.reader异常捕获手动清洗。

直接用 pandas.read_csv() 会报错,不是因为文件“真坏了”,而是它默认按严格 CSV 规范解析——比如某行多了一个逗号、引号没闭合、换行符在字段里,就直接抛 ParserError。解决思路不是“修复文件”,而是让解析器容忍这些不规范。
用 error_bad_lines=False(旧版)或 on_bad_lines='skip'(新版)跳过异常行
这是最常用也最直接的应对方式:让 pandas 主动忽略无法解析的整行,继续读后续内容。注意参数名在 pandas 1.3+ 已改为 on_bad_lines,旧版用 error_bad_lines 会被警告。
常见错误现象:ParserError: Expected 5 fields in line X, saw 6
-
on_bad_lines='skip':跳过该行,不报错,但你要意识到数据有缺失 -
on_bad_lines='warn':打印警告并跳过,适合调试时定位坏行位置 - 不能设为
'raise'(默认值),否则一碰到就中断 - 这个参数只对结构错位有效(如列数不一致),对编码错误或空文件无效
用 quoting=csv.QUOTE_NONE 避免引号解析干扰
很多“损坏”其实是人工编辑导致引号不配对或字段含未转义引号,pandas 默认按 RFC 4180 解析引号,一遇到就崩溃。关掉引号解析,让所有内容当纯文本处理,反而更鲁棒。
使用场景:Excel 导出后手动改过、日志拼接生成的 CSV、字段含 JSON 片段
- 必须配合
escapechar='\'或doublequote=False使用,否则反斜杠或双引号可能引发新问题 - 加上
engine='python',因为 C 引擎不支持QUOTE_NONE - 示例:
pd.read_csv('bad.csv', quoting=csv.QUOTE_NONE, engine='python', on_bad_lines='skip')
逐块读取 + 异常捕获,手动清洗每行
当文件大、坏行分布杂、且你清楚坏数据的模式(比如某列总是多一个逗号),靠跳过或关引号不够——得自己控制解析逻辑。
性能影响:比直接 read_csv 慢 3–5 倍,但可控性强
- 用内置
csv.reader逐行读,捕获csv.Error,对单行做字符串切分或正则清理 - 对含嵌入换行符的字段(如备注列含
),先用
open(..., newline='')打开,否则csv.reader会误判行数 - 不要用
str.split(',')替代csv.reader,它无法处理带逗号的 quoted 字段 - 示例关键片段:
with open('bad.csv', newline='') as f: reader = csv.reader(f) for i, row in enumerate(reader): try: # 尝试转成 DataFrame 行或存入 list pass except csv.Error as e: # 记录第 i 行错误,按需修复字符串再 parse fixed = fix_malformed_line(f.readline())
真正难的不是跳过坏行,而是判断哪一行该跳、哪一行该修、哪一行其实只是编码不对(比如 GBK 文件用 UTF-8 打开)。建议先用 file -i bad.csv 或 Python 的 chardet.detect() 确认编码,再决定解析策略。否则 on_bad_lines='skip' 可能把你本想保留的中文行全跳了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











