encoding参数用于指定open()函数打开文本文件时的编码格式,必须显式设置如'utf-8'或'gbk',避免依赖系统默认编码(windows常为gbk,linux/macos多为utf-8)导致乱码。

open() 默认用系统编码写入,Windows 下通常是 gbk,而你代码里写的中文是 Unicode 字符,Python 会按系统编码转成字节存盘。如果后续用 utf-8 打开,或在 Linux/macOS 下读,就必然乱码。
写文件时没指定 encoding 参数
这是最常见原因。Python 3 的 open() 在不传 encoding 时,会调用 locale.getpreferredencoding() 获取系统默认编码——Windows 是 gbk,Linux/macOS 通常是 utf-8。但跨平台共享文件时,这个差异直接导致乱码。
- 错误写法:
with open('out.txt', 'w') as f: f.write('你好') - 正确写法:
with open('out.txt', 'w', encoding='utf-8') as f: f.write('你好') - 如果目标是 Excel 兼容(避免 BOM 引发问题),改用
encoding='utf-8-sig'
读写编码不一致(比如写 gbk 却用 utf-8 读)
写入和读取必须用同一套编码逻辑。很多人只 fix 写入,却忘了检查读取端是否同步调整。
- 写入用了
encoding='gbk',读取就必须用encoding='gbk' - 更稳妥的做法是统一用
utf-8或utf-8-sig,避免依赖系统环境 - 若读取旧文件发现乱码,先用
chardet检测真实编码:chardet.detect(open('old.txt', 'rb').read())
errors 参数被忽略,导致写入失败或静默丢字
有些文本含无法用目标编码表示的字符(比如 emoji 或生僻字),不设 errors 可能抛 UnicodeEncodeError,或干脆跳过——表面“成功”实则内容缺失。
- 容错写法:
open('log.txt', 'a', encoding='utf-8', errors='replace')(用 替代非法字符) - 或
errors='ignore'(直接跳过),但需确认业务允许丢字 - 生产环境建议优先用
errors='strict'(默认),配合提前校验,而不是事后补救
utf-8 设置,最后谁也说不清源头在哪。动手前先确认:你的编辑器保存格式、Python 脚本头部声明、open() 参数、终端显示编码,这四者是否全部对齐。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











