GBK文件需显式指定encoding='gbk'读取,否则因Python默认UTF-8解码而报UnicodeDecodeError;不确定时用'gb18030'更鲁棒,禁用errors='ignore';批量处理应先用charset-normalizer检测编码,再流式转存为UTF-8。
GBK文件用
直接读会报
Windows上老项目存的文本文件,十有八九是GBK编码,但Python默认按UTF-8解码。一读就崩,典型错误是
。这不是文件坏了,是解码器没对上。
关键不是“怎么读”,而是“必须显式指定
”。别信IDE自动检测——它常误判,尤其文件开头没BOM时。
是安全起点;UTF-8文件用这个会报错,所以得先确认编码(见下一条)
如果不确定是GBK还是GB2312/GBK18030,用
更鲁棒(它向下兼容GBK和GB2312)
千万别用
硬吞乱码——覆写后内容就永久损坏了
批量识别编码再转存,别硬猜
一个目录里混着GBK、UTF-8、甚至带BOM的文件?靠扩展名或文件名判断编码纯属碰运气。真实场景里,得用
或
实测前10KB字节。
推荐
(比
快且准):
立即学习
“
Python免费学习笔记(深入)
”;
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
只检测不读全文件:
置信度低于0.7的文件,跳过或人工检查——强行转换风险远大于漏处理
检测完立刻用对应编码读取,再用
写入,避免中间环节二次编码
遍历+
覆写,注意换行符和BOM
用
找文件比
清爽,但覆写时有两个隐形坑:Windows换行符
会被
自动转成
,以及UTF-8 BOM问题。
保持原换行风格:读取时用
,写入时用
(需先用
探一次)
不想加BOM?写入时用
会自动加,要纯UTF-8就坚持用
务必先写到临时文件,再
原子替换——断电或崩溃时不会丢原文件
大文件别一次性
,用
分块转
几百MB的日志文件,用
直接加载进内存,Python进程可能被系统OOM Kill。得流式处理。
核心思路:按行或按固定大小块读取,解码→重新编码→写入。注意块边界不能切在GBK双字节中间。
安全块大小:用
或
字节(避开单个GBK字符跨块)
读块后,末尾字节若为
范围(GBK首字节特征),说明可能截断,多读1–2字节再回退
实际更省事:用
包装二进制流,让它自动处理编码边界——但得确保
参数传对
最麻烦的永远不是转换本身,而是确认哪些文件真需要转。比如配置文件里硬编码的GBK路径,转完UTF-8后程序反而打不开——这种依赖编码的逻辑,得同步改代码,光转文件没用。
open()UnicodeDecodeError'utf-8' codec can't decode byte 0xc1 in position 0encoding='gbk'open(path, 'r', encoding='gbk')encoding='gb18030'errors='ignore'chardetcharset-normalizercharset-normalizerchardetpip install charset-normalizerfrom charset_normalizer import from_path; r = from_path(file_path)[0]; r.confidence > 0.7 and r.charset == 'GBK'encoding='utf-8'pathlibopen()pathlib.Pathos.walk\r\nopen(..., 'w', encoding='utf-8')\nnewline=''newline=orig_newlinereadline()encoding='utf-8-sig'encoding='utf-8'os.replace()read()iter()read()409681920x81–0xFEio.TextIOWrapperbuffer