Python 3.9打开无特殊字符纯文本文件为何需指定utf-16编码
问题解答
首先明确:Python 3.9 没有强制要求所有文件必须使用utf-16编码打开,你遇到的问题本质是文件实际存储编码和读取时使用的解码编码不匹配,和Python版本升级没有直接关联。
具体原因拆解
- 报错信息中提到的
0xff是UTF-16 LE(小端序)编码的BOM(字节顺序标记)的首字节,说明你读取的这个文本文件本身就是以UTF-16格式保存的,并非你以为的普通UTF-8/ASCII编码。大概率是该文件在创建/保存时,编辑器(比如Windows记事本)默认选择了Unicode(即UTF-16 LE)编码,和其他普通文件的编码不一致。 - Python在Windows平台调用
open()函数且不指定encoding参数时,默认使用系统当前区域的编码(中国大陆地区一般为GBK/CP936,欧美地区一般为CP1252)。你之前读取的文件编码和系统默认编码一致,所以即使不指定参数也能正常运行;而这个UTF-16编码的文件用默认编码解码就会出现乱码,用UTF-8解码时无法识别BOM头就会抛出UnicodeDecodeError异常。 - 你感知到的「升级Python3.9后才出问题」属于巧合,刚好你在换版本后第一次读取了这个编码特殊的文件,和Python版本本身无关。
后续使用建议
- 读写文本文件时永远明确指定
encoding参数,不要依赖系统默认值,可保证代码在不同平台、不同环境下表现一致。 - 如果不确定文件的编码,可先读取文件前2-3个字节做判断:
- 开头为
\xff\xfe:对应UTF-16 LE编码 - 开头为
\xef\xbb\xbf:对应带BOM的UTF-8编码 - 无特殊开头标记:一般为无BOM UTF-8或系统默认ANSI编码
- 开头为
- 保存文本文件若无特殊要求,优先选择无BOM的UTF-8格式,通用性最强。
内容的提问来源于stack exchange,提问作者Al G
相关产品推荐
相关产品推荐

