Python读取文件乱码的根本原因是文件保存编码与程序指定编码不一致,需用chardet检测真实编码,读写时显式指定encoding参数,并统一IDE、编辑器与代码的编码设置。

Python读取文件出现乱码,根本原因是文件保存时的编码格式与程序中指定的编码不一致。最常见的是用UTF-8保存的文件,却用系统默认编码(如GBK)去读,或反过来。
确认文件真实编码
不能只看编辑器右下角显示,要实际检测。推荐用chardet库快速判断:
- 安装:
pip install chardet - 检测示例:
import chardet<br>with open('test.txt', 'rb') as f:<br> raw = f.read(1000) # 读前1000字节足够判断<br> print(chardet.detect(raw)['encoding']) - 注意:
chardet是概率推测,对短文本或纯ASCII内容可能不准;优先以文件来源(如网页抓取、Excel导出、别人发来的文本)为依据辅助判断
读取时显式指定正确编码
Python 3中open()默认使用locale.getpreferredencoding()(Windows常为GBK),必须手动覆盖:
- UTF-8文件(含中文但无BOM):
open('file.txt', encoding='utf-8') - UTF-8 with BOM文件(记事本另存为“UTF-8”时生成):
open('file.txt', encoding='utf-8-sig')(自动跳过BOM) - GBK/GB2312文件(常见于旧Windows系统或部分国产软件):
open('file.txt', encoding='gbk') - 不确定时可加异常处理尝试多种编码:
encodings = ['utf-8-sig', 'utf-8', 'gbk', 'gb2312']<br>for enc in encodings:<br> try:<br> with open('file.txt', encoding=enc) as f:<br> content = f.read()<br> print(f'成功,编码:{enc}')<br> break<br> except UnicodeDecodeError:<br> continue
写入文件时统一编码规范
避免给后续读取埋坑,写入务必显式声明编码:
立即学习“Python免费学习笔记(深入)”;
- 始终用UTF-8(推荐):
open('out.txt', 'w', encoding='utf-8') - 需要兼容旧系统且确定目标环境是GBK,才用
encoding='gbk' - 避免不写
encoding参数——依赖系统默认极不可靠 - 如果内容含中文,写入前可先用
content.encode('utf-8').decode('utf-8')验证是否为合法UTF-8字符串(防止源数据本身已损坏)
IDE与编辑器设置同步
PyCharm、VS Code等会按自身设置编码读取文件,但Python解释器仍按代码中encoding参数执行。需保持三者一致:
- VS Code:右下角点击编码名 → 选择“Reopen with Encoding” → 选UTF-8或GBK → 再点“Save with Encoding”固化
- PyCharm:File → Settings → Editor → File Encodings → 全局编码和项目编码设为UTF-8,勾选“Transparent native-to-ascii conversion”(非必需)
- 记事本:另存为时下拉菜单明确选“UTF-8”(不是“Unicode”或“UTF-8-BOM”)


















