Python3读取UTF-8文件为何需指定编码?shebang为何无效?
Python3中打开UTF-8文件为何仍需指定
encoding="utf-8"? 这个问题其实混淆了两个完全不同的编码设置场景——Python脚本自身的编码,和打开外部文件时使用的编码,咱们一步步拆解:
脚本编码声明≠外部文件编码
你脚本里的# -*- coding: utf-8 -*-是告诉Python解释器:这个.py脚本文件本身是用UTF-8编码的。它的作用是确保脚本里的字符串字面量(比如包含非ASCII字符的文件名、注释等)能被正确解析,和你打开外部的hg19.json文件时使用的编码完全是两回事。
Python3中open()的默认编码由系统locale决定
Python3的open()函数默认使用的编码,并不是固定为UTF-8,而是由当前运行环境的系统locale设置决定的。在Ubuntu Jessie中,如果你的运行环境(比如非交互式shell、或者locale变量未正确配置)的locale没有设置为UTF-8,Python会自动回退到ASCII作为默认编码——这就是你触发UnicodeDecodeError的核心原因。
你可以快速验证这一点:在出现错误的环境里运行以下代码:
import locale print(locale.getpreferredencoding(False))
如果输出结果是ASCII,那就实锤是locale配置的问题了。
显式指定编码是更可靠的实践
虽然你可以通过配置系统locale为UTF-8(比如设置LC_ALL=en_US.UTF-8)来让open()默认使用UTF-8,但显式添加encoding="utf-8"是更好的选择:
- 让代码的行为完全不受运行环境的locale影响,可移植性更强;
- 能明确告诉代码维护者(包括未来的你)目标文件的编码格式,可读性和可维护性更好。
内容的提问来源于stack exchange,提问作者RightmireM
相关产品推荐
相关产品推荐

