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(中文两个字节的区间)
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))
双击打开是自动猜编码;手动导入可以指定。数据 → 获取数据 → 从文本/CSV → 文件原始格式选 65001: Unicode (UTF-8) 或 936: GB2312。这是不改文件本身的做法,适合别人发来的文件你只想看一眼。
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。
乱码只是最显眼的问题。修好之后,你的数据大概率还藏着这些:
- 或 1,234.50,整列变文本,求和归零这些可以用我们的免费工具 30 秒查完(浏览器本地解析,文件不上传):
utf-8-sig),Excel 和 pandas 都认