CSV 打开乱码怎么办?

Excel 双击打开 CSV 一片「鏖戝挱鍦板尯」,或者中文全部变成问号。90% 的乱码都是同一个原因: 文件的真实编码和打开方以为的编码不一致。

先判断文件到底是什么编码

# Linux / Mac
file -i data.csv

# Windows PowerShell:看前三个字节
[IO.File]::ReadAllBytes("data.csv")[0..2] -join " "
# 239 187 191 = UTF-8 带 BOM
# 213 42  ... = GBK(中文双字节区间)

三种修复方法

方法 1:给 UTF-8 文件加 BOM(最快)

Excel 判断编码的逻辑很原始:有 BOM 就按 UTF-8 读,没 BOM 就按系统默认(中文系统是 GBK)读。 所以 UTF-8 无 BOM 的文件在中文 Excel 里必乱。

Python:
  open('data.csv','w',encoding='utf-8-sig')   # utf-8-sig = 带 BOM 的 UTF-8

PowerShell:
  $c = [IO.File]::ReadAllText('data.csv', [Text.Encoding]::UTF8)
  [IO.File]::WriteAllText('data-bom.csv', $c, [Text.UTF8Encoding]::new($true))

方法 2:Excel 里用「数据 → 从文本/CSV 导入」

双击是自动猜编码,手动导入可以指定。数据 → 获取数据 → 从文本/CSV → 文件原始格式选 65001: Unicode (UTF-8) 或 936: GB2312。不改文件本身,适合看别人发来的东西。

方法 3:pandas 读取时指定编码

import pandas as pd
df = pd.read_csv('data.csv', encoding='utf-8-sig')   # 有 BOM 的 UTF-8
df = pd.read_csv('data.csv', encoding='gbk')         # 国内老系统导出
df = pd.read_csv('data.csv', encoding='gb18030')     # GBK 超集,更保险

报 UnicodeDecodeError: 'utf-8' codec can't decode 就是文件不是 UTF-8,先试 gb18030。

乱码之外,CSV 还有 4 个更隐蔽的坑

这些 30 秒能查完(浏览器本地解析,文件不上传):

免费检测 CSV 数据质量 →

怎么预防