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(中文双字节区间)
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 秒能查完(浏览器本地解析,文件不上传):
免费检测 CSV 数据质量 →utf-8-sig),Excel 和 pandas 都认