Python中文乱码主因是编码不匹配,解决核心是明确源文件真实编码、显式指定encoding参数及合理fallback;读文件推荐utf-8-sig或gbk等精准编码,写文件统一用utf-8-sig并加编码声明。

Python文件读写时遇到中文乱码,多数是编码不匹配导致的,尤其在Windows(默认GBK)和Linux/macOS(默认UTF-8)之间切换时最常见。核心思路是:**明确源文件真实编码 + 显式指定encoding参数 + 合理 fallback 处理**。
一、如何判断文件的真实编码?
不能只看文件后缀或编辑器显示。推荐用命令行工具快速探测:
- Linux/macOS:终端运行 file -i filename.py 或 enca -L zh filename.py(需安装enca)
- Windows:用VS Code打开 → 右下角点击编码名称(如“UTF-8”),选“Reopen with Encoding”逐个尝试;或用Python脚本调用chardet库粗略检测(注意:chardet对短文本或纯ASCII文本可能不准)
二、读文件时避免UnicodeDecodeError
不要依赖默认编码。务必显式传入encoding,并预设容错策略:
- 已知是UTF-8但含BOM:用 encoding="utf-8-sig"(自动剥离BOM,推荐)
- 不确定编码但想尽量读通:用 encoding="utf-8", errors="ignore"(跳过非法字节)或 errors="replace"(替换为)
- 确定是GBK(如旧版Windows生成的txt):直接写 encoding="gbk",别用"gb2312"或"gb18030"除非有特殊需求
三、写文件时统一用UTF-8并注明声明
为保障跨平台兼容性,写入一律用UTF-8,并在Python源码顶部加编码声明(虽非强制,但显式更稳妥):
立即学习“Python免费学习笔记(深入)”;
- 文件开头第一行或第二行写:# -*- coding: utf-8 -*-
- 写入时明确指定:open("out.txt", "w", encoding="utf-8")
- 若需被其他程序(如Excel)正确识别中文,建议加BOM:encoding="utf-8-sig"
四、处理混合编码或老旧文件的实用技巧
遇到部分行乱码、部分正常的情况,说明文件本身编码不统一(常见于日志拼接或爬虫抓取)。可逐行尝试解码:
- 用codecs模块按行读取并捕获异常:codecs.open(path, "r", encoding="utf-8", errors="replace")
- 或手动循环+try/except:for line in f: try: ... except UnicodeDecodeError: continue
- 批量转换编码:先用iconv(Linux/macOS)或Notepad++(Windows)将源文件转为UTF-8再处理,比代码硬扛更可靠










