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

使用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.rhn
    
    该命令会输出文件的编码信息(比如ISO-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:51:15