windows下读csv需显式指定encoding:gbk文件用"gbk"或"gb18030",utf-8文件用"utf-8-sig";pandas中统一用sep而非delimiter,避免冲突;字段含特殊字符时应调整quoting或engine参数。

open() 读 CSV 不加 encoding 会乱码
Windows 默认用 GBK 编码存 CSV,而 Python 3 的 open() 在多数系统上默认用 UTF-8 解码。不显式指定编码,中文列名或内容直接变 UnicodeDecodeError 或一堆问号。
- Windows 上保存的 CSV,优先试
encoding="gbk"(或"gb18030",兼容性更好) - Mac/Linux 或明确是 UTF-8 导出的文件,用
encoding="utf-8-sig"——-sig能自动跳过 BOM,避免首列名前多出\ufeff - 别依赖
locale.getpreferredencoding(),它在不同环境返回不稳定,尤其打包成 exe 后常失效
pandas.read_csv() 的 sep 和 delimiter 别混用
sep 和 delimiter 是同一个参数的两个别名,但 pandas 只认 sep 为首选;如果同时传两者,会报 TypeError: read_csv() got multiple values for argument 'sep'。
- 统一用
sep=",",逗号分隔时可省略;制表符用sep="\t";中文 Excel 导出的 CSV 有时用sep=","(全角逗号),需手动确认 - 遇到字段内含换行或引号,别硬调
sep,先检查是否该用quoting=csv.QUOTE_MINIMAL(配合import csv)或设engine="python"避免 C 引擎解析失败 -
sep=None并不会自动推断分隔符,而是触发csv.Sniffer,但小文件(
写 CSV 时 newline="" 必须显式传给 open()
Windows 下用 open(..., "w") 写 CSV,若不加 newline="",csv.writer 或 to_csv() 会在每行末额外加一个 \r\r\n,导致 Excel 打开时多出空行。
小麦企业网站展示系统介绍:一、安装使用将xiaomai.sql导入数据库二、后台登录后台帐号,密码默认都是admin,config.php 配置文件可根据自行需要修改,IP地址,数据库用户名,密码,及表名后台目录默认admin,支持自行任意修改目录名三、注意事项1 本源码完全免费,采用伪静态,减少不必要的源码重复,速度更快,支持二次开发。2、注明本程序编码为UTF8,如发生乱码,请注意修改编码3、
- 正确写法是
open("out.csv", "w", newline="")—— 注意是空字符串,不是None或"\n" -
pandas.DataFrame.to_csv()内部已处理这点,不用管newline,但如果你用csv.writer手动写,这步不能漏 - 这个参数对 Linux/macOS 无害,所以统一加上更安全,别按系统条件判断
to_csv() 的 index 参数一不留神就多出一列
DataFrame.to_csv() 默认写入行索引(即第 0 列是数字序号),看起来像“多了一列”,尤其原始数据本就有 ID 列时,容易误以为数据错位。
立即学习“Python免费学习笔记(深入)”;
- 绝大多数场景应显式写
index=False,除非你真需要把索引当一列导出 - 如果原 DataFrame 索引是带名的(
df.index.name == "user_id"),且你设了index=True,那导出 CSV 第一列名会是user_id,但内容仍是行号——这不是 bug,是索引名和索引值分离导致的,得先reset_index(drop=False)再导出才一致 - 用
to_csv(index_label="id")改列名只在index=True时生效,别指望它拯救index=False的场景
CSV 看似简单,但编码、换行、索引、分隔符这四点只要漏一个,就可能让下游同学花半小时查不出为啥 Excel 里文字挤在一起、行数对不上、或者第一列莫名多出数字。实际项目里,建议把常用读写逻辑封装成小函数,把 encoding、newline、index 这些都固化下来,比每次临时想保险得多。









