pandas读CSV失败几乎是每个搞数据的人都踩过的坑:一会儿报UnicodeDecodeError,一会儿报ParserError,一会儿明明有100列却只读出来1列,搞得人怀疑人生。今天我们就把pd.read_csv为什么莫名其妙失败、以及最常用也最容易踩雷的参数到底该怎么指定,一次性讲透,照着抄以后再也不掉坑里。
一、pd读取CSV为什么失败
读不出来的根源基本就这五类,90%的情况都中:
1、编码不对,最常见也最隐蔽
导出CSV基本都是gbk/gb2312/utf-8-sig,pandas默认猜utf-8,遇到中文直接UnicodeDecodeError;
2、分隔符不是逗号
很多人用Excel保存CSV其实用的是制表符、分号、竖线,甚至中文逗号“,”pandas死活猜不对,报“CParserError:Error tokenizing data”;
3、有BOM头或隐藏字符
用Windows记事本、WPS、国内报表系统保存的CSV前面会带个BOM(ufeff),pandas直接把第一列名读成“ufeffID”,或者把第一行当列名吞掉;
4、行里换行或引号没闭合
Excel里某个单元格写了多行文字(Alt+Enter),或者引号没成对,pandas直接报“ParserError:Expected X fields in line Y,saw Z”;
5、文件太大直接爆内存
几百MB甚至GB的CSV,pandas一次性全读进内存直接OOM,或者卡死半天没反应。
二、pd读取参数应怎样指定
下面这套参数组合能解决95%的场景,直接抄就行:
1、最稳万能版(推荐日常直接用)
2、报表专用(gbk+中文逗号+BOM)
3、大文件分块读(>500MB)
4、有多行表头或跳过垃圾行
5、列名在第2行+第1行是标题合并
三、pd读取CSV长效不翻车技巧
一次成功不等于下次不炸,再补这几招彻底根治:
1、永远先用记事本或VS Code打开CSV看一眼
看编码、分隔符、是否有BOM、表头几行、最后有没有合计行,比直接跑代码快100倍;
2、写一个万能读取函数放项目里
以后全项目统一调这一个,永不踩坑;
3、大文件先用Linux命令预处理
4、永远先读100行测试
确认没问题再全量读;
5、公司统一禁止用Excel保存CSV
要求财务/业务用“另存为→UTF-8 CSV”或直接导出tsv,彻底杜绝BOM和中文逗号。
总结
pd读取CSV为什么失败,pd读取参数应怎样指定,说白了就是编码、分隔符、BOM、换行、大文件这五大杀手。只要记住万能参数组合(utf-8-sig+sep=None+engine='python'+dtype=str)、先看文件再读、写safe_read_csv函数、大文件分块读、公司禁Excel保存这五板斧,读CSV就能从“玄学”变成“复制粘贴就行”,再也不用半夜被“ParserError”惊醒。