Python包内置.ods文件读取时报KeyError: '.ods'如何解决?
问题解决方法
问题根因
- 打包配置缺失:默认setuptools只会打包
.py后缀的文件,你没有配置将.ods文件纳入打包范围,虚拟环境安装完成后该文件不会出现在site-packages的包目录下,程序找不到对应文件触发扩展名识别错误 - 路径硬编码错误:你写的相对路径
librebook.ods是相对于脚本运行时的工作目录,而非包的安装目录,即便文件存在,运行时工作目录不对也会找不到文件
修复步骤
1. 配置打包规则包含ods文件
你可以选择以下任意一种方式配置:
方式一:通过setup.py的package_data参数配置
修改根目录的setup.py,添加包数据配置:
from setuptools import setup, find_packages setup( name="mypackage", version="0.1", packages=find_packages(where="src"), package_dir={"": "src"}, # 新增以下配置,指定mypackage下所有ods文件需要打包 package_data={ "mypackage": ["*.ods"] } )
方式二:通过MANIFEST.in配置
在项目根目录新建MANIFEST.in文件,写入以下内容:
include src/mypackage/*.ods
然后在setup.py中添加include_package_data=True参数即可。
2. 动态获取包内文件路径,避免硬编码相对路径
使用Python标准库importlib.resources动态获取包内文件的绝对路径,适配不同安装环境:
from pandas_ods_reader import read_ods from importlib.resources import files import mypackage # 动态获取包内ods文件的绝对路径 ods_file_path = files(mypackage).joinpath("librebook.ods") # 转为字符串路径传入read_ods df = read_ods(str(ods_file_path))
如果你使用的是Python3.8及更早版本,可安装第三方兼容包importlib_resources,导入语句替换为from importlib_resources import files即可。
排查验证点
- 确认虚拟环境中已经安装了
pandas_ods_reader依赖 - 安装包后可进入虚拟环境的
site-packages/mypackage目录,确认librebook.ods文件存在
内容的提问来源于stack exchange,提问作者Stackaccount1
相关产品推荐
相关产品推荐

