CSV 打开乱码怎么办?

Excel 双击打开 CSV 一片「鏖戝挱鍦板尯」,或者中文全部变成问号 —— 这是国内做数据的人最常遇到的问题。90% 的乱码都是同一个原因:文件的真实编码和打开方以为的编码不一致。

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

用记事本打开 CSV → 另存为 → 看「编码」下拉框里显示什么。或者用命令行:

file -i data.csv        # Linux/Mac
# 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 数据质量 →

怎么预防(写给要长期处理数据的人)