遇到unicodedecodeerror应先试encoding='gbk',再用chardet.detect探测编码;列名乱序多因分隔符错误,需显式指定sep;to_csv需控制date_format、float_format等参数避免格式崩坏。

读取CSV时编码错误:UnicodeDecodeError 怎么办
Python 默认用 utf-8 读 CSV,但 Windows 记事本保存的 CSV 常是 gbk 或 gb2312,直接读会爆 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0。
- 先试
encoding='gbk',多数中文 Excel 导出 CSV 都能过 - 不确定编码时,用
chardet库探测:chardet.detect(open('file.csv', 'rb').read(10000)) - 别硬写死
encoding='utf-8-sig'—— 它只对带 BOM 的 UTF-8 有效,对 GBK 文件反而报错 - 如果文件来自不同来源(比如部分
utf-8、部分gbk),得逐个探测,不能统一设一个编码
pd.read_csv() 读出来列名乱序或缺失?检查分隔符和 header
列名错位、首行变数据、多出空列……八成是分隔符没对上。Excel 导出的 CSV 多用逗号,但有些系统(尤其财务软件)导出用分号 ; 或制表符 \t。
- 显式指定
sep:逗号文件用sep=',',分号文件用sep=';',TSV 用sep='\t' - 如果第一行不是列名,加
header=None,再用names=...手动赋列名 - 如果列名里有空格或特殊符号,
read<em>csv</em>默认会把它们当普通字符串处理,但后续做df['列 名']没问题;想转成合法变量名可用df.columns = df.columns.str.replace(r'[^a-zA-Z0-9]', '_') -
skiprows很有用:有些 CSV 前几行是说明文字,不跳过会导致列数错乱
批量写入时格式崩了:日期变数字、数字带千分位、布尔值变 TRUE/FALSE
to_csv() 默认行为对“人眼可读”不友好:Excel 里日期显示成 2024-05-20 00:00:00 是对的,但有时你想要 2024/05/20;数字可能被写成 1,234.56,Excel 再读就识别成文本。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 控制日期格式:
date_format='%Y/%m/%d'(注意是斜杠,Excel 更认这个) - 关闭千分位:
float_format='%.2f',避免1234.56变1,234.56 - 布尔值统一转字符串:
df.astype({col: str for col in df.select_dtypes(bool).columns}),否则 Excel 会把True当公式解析 - 写入前检查
df.dtypes,特别是object列里混着数字和空字符串,容易在 Excel 里自动转列类型失败
性能卡在循环 read_csv + to_csv?别用 for,改用 glob + concat
单个文件处理没问题,但 50 个 CSV 各 10MB,挨个 pd.read_csv 再 to_csv,I/O 开销大、内存涨得快、还容易中途报错中断。
- 用
glob.glob('*.csv')一次性拿到路径列表,比os.listdir更准(支持通配) - 对每个文件用
pd.read_csv(..., usecols=...)只读需要的列,省内存 - 如果目标是合并后统一处理,先
[pd.read_csv(f) for f in files]再pd.concat(..., ignore_index=True),比逐个处理再 append 快得多 - 写入大文件时加
index=False,否则默认加一列索引,在 Excel 里多占一列还容易误操作
实际跑起来最常掉坑的地方不是语法,是编码和分隔符猜错了——宁可花 30 秒用记事本打开 CSV 看一眼开头几个字节,也别靠经验硬试。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










