CSV中文乱码需匹配真实编码,常见为GBK或utf-8-sig;dtype须显式指定防类型错误,如手机号用str、含空整数用"Int64";结构异常用skiprows/header/usecols调整;大文件用chunksize分块处理,nrows仅截断。

读 CSV 时中文乱码,encoding 参数到底该填啥
乱码不是编码错了,是没对上源文件真实编码。Windows 记事本默认存为 GBK,但 Python 默认按 utf-8 解,一读就崩。
- 先用编辑器(如 VS Code、Notepad++)打开 CSV 文件,看右下角显示的编码,常见有
GBK、GB2312、utf-8-sig(带 BOM 的 UTF-8) -
utf-8读不了就试试utf-8-sig,尤其 Excel 另存为 CSV 后经常带 BOM - 真不确定就用
chardet库探测:import chardet<br>with open("data.csv", "rb") as f:<br> print(chardet.detect(f.read(10000))) - 别硬套
latin-1—— 它能“不报错”,但中文全变 ,后续清洗更麻烦
read_csv 和 read_excel 的 dtype 参数怎么用才不翻车
dtype 不是锦上添花,是防止自动类型推断出错的核心防线。比如手机号被读成 int64,开头 0 就没了;日期列被当成字符串,后续 pd.to_datetime 失败率高。
- 强制指定列类型:
dtype={"phone": str, "id": str, "score": float},注意字符串列必须写str,不是"string"或"object" - 整数列含空值?不能用
int,得用可空整型:dtype={"age": "Int64"}(注意首字母大写,这是 pandas 的 nullable int 类型) -
read_excel对dtype支持有限,某些版本会忽略;稳妥做法是先读再用astype转,或加converters参数:converters={"code": str}
Excel 表格有合并单元格、空行、多表头?skiprows、header、usecols 怎么配
Excel 原始格式往往不是“干净表格”,直接 read_excel 会把合并单元格读成 NaN,把说明文字当数据,把空行列进 DataFrame。
-
header不只是行号,可以是列表,比如表头跨两行:header=[0, 1],生成 MultiIndex - 跳过前 N 行说明文字:
skiprows=3;但若第 3 行才是真实表头,要写skiprows=2, header=0 - 只读特定列最省内存:
usecols="A:C"或usecols=[0, 1, 3],比读完再drop快得多 - 合并单元格无法自动还原,pandas 一律填 NaN;如果必须保留逻辑结构,得靠
openpyxl手动解析,read_excel本身不处理这个
读大文件卡死、爆内存?chunksize 和 nrows 是什么关系
chunksize 不是“分块读取”,是返回一个可迭代对象,每次 yield 一个 DataFrame;nrows 是硬截断,只读前 N 行——两者目的不同,别混用。
- 查数据概览、试跑逻辑:用
nrows=1000快速加载样本 - 逐块处理日志类大 CSV:
for chunk in pd.read_csv("big.csv", chunksize=5000): process(chunk),每块独立内存,不会累积 -
chunksize下不能直接用df.shape,得手动累加;也别在循环里反复pd.concat,容易内存翻倍——该存中间结果就存文件 - Excel 不支持
chunksize,大 Excel 必须转 CSV 再处理,或改用openpyxl流式读单元格
编码、类型、结构、规模——这四个点任何一个没对齐,read_csv 和 read_excel 就可能静默出错。特别是 encoding 和 dtype,不报错不代表读对了,得拿原始文件肉眼比对几行。











