使用importlib.resources.files()读取文件触发UnicodeDecodeError问题
问题解决:importlib.resources读取数据文件时的UnicodeDecodeError
错误原因
你遇到的UnicodeDecodeError根本原因是**two.rhn是二进制文件,而非UTF-8编码的文本文件**,read_text()默认用UTF-8解码二进制数据,自然会失败。importlib.resources本身没有问题,路径识别正常说明包数据配置是正确的。
解决方案
1. 直接读取二进制内容(推荐)
如果two.rhn是二进制格式(比如自定义二进制协议、非文本资源等),不要用read_text(),改用read_bytes()直接获取原始字节数据:
# package.__init__.py from importlib.resources import files PACKAGE_DATA = files('package') KEYWORD_PATH = PACKAGE_DATA.joinpath('one.ppn') # 读取二进制文件 CONTEXT_BYTES = PACKAGE_DATA.joinpath('two.rhn').read_bytes()
后续处理时直接操作CONTEXT_BYTES这个字节对象即可,无需解码。
2. 确认文件编码(如果是文本文件)
如果你确定two.rhn是文本文件,只是编码不是UTF-8,可尝试以下步骤:
- 在Raspberry Pi终端用
file命令检测文件类型:
该命令会输出文件的编码信息(比如file /home/millertime/Desktop/Package/package/two.rhnISO-8859-1、GBK等)。 - 用检测到的编码调用
read_text():
若CONTEXT_PATH = PACKAGE_DATA.joinpath('two.rhn').read_text(encoding='ISO-8859-1')chardet检测失败,可能是文件有损坏,或混合了二进制与文本内容。
3. 验证包数据配置(可选)
你的pyproject.toml配置是正确的,可编辑安装下数据文件能被正常访问,无需调整。如果后续打包发布,确保package-data包含所有需要的文件即可。
额外提示
- 避免在
__init__.py中直接执行文件读取操作,建议封装成函数,在需要时再调用,减少模块导入时的开销。 - 若
one.ppn也是二进制文件,同样用read_bytes()处理。
内容的提问来源于stack exchange,提问作者MillerTime
相关产品推荐
相关产品推荐

