You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:42:38