Python 3.12读取包内文件的最佳实践及配置咨询
从Python包内读取数据的最佳实践疑问
我想了解Python包内读取数据的最佳实践,已知Python 3.12中推荐使用importlib.resources。
最初的尝试与问题
初始包结构
foo ├── setup.cfg ├── data │ ├── __init__.py │ └── data.csv │ └── data2 │ ├── __init__.py │ └── data2.csv └── src └── foo ├── __init__.py └── bar.py
读取数据的代码(bar.py)
import importlib.resources def get_data_file(file_name): return importlib.resources.files("foo.data").joinpath(file_name).read_text()
setup.cfg配置
include_package_data = True [options.package_data] mypkg = data/*.csv mypkg.data2 = data2/*.csv
预期使用方式
import foo.bar foo.bar.get_data_file('data.csv') foo.bar.get_data_file('data2/data2.csv')
但运行时出现错误:No module named 'foo.data'
调整后的方案(可运行但存疑)
修改后的包结构
foo ├── setup.cfg └── src ├── data │ ├── __init__.py │ └── data.csv │ └── data2 │ ├── __init__.py │ └── data2.csv └── foo ├── __init__.py └── bar.py
修改后的读取代码(bar.py)
import importlib.resources def get_data_file(file_name): return importlib.resources.files("data").joinpath(file_name).read_text()
虽然调整后可以成功读取文件,但我不确定这是否是包结构、setup.cfg配置及importlib语法的最佳实践。个人认为将data文件夹放在根目录更合理,且setup.cfg的语法让我感到困惑。
补充疑问
- 能否详细说明相对导入与importlib的使用区别?
- 既然数据本质上属于foo包,是否应该采用如下包结构?
foo ├── setup.cfg └── src └── foo ├── data │ ├── __init__.py │ └── data.csv │ └── data2 │ ├── __init__.py │ └── data2.csv ├── __init__.py └── bar.py
- 我的使用场景:用户安装包后,可利用data.csv和data2.csv中的数据进行计算,这些数据会被解析为pandas DataFrames。这是否是为用户提供包及所需数据的正确方式?
- 某示例与相关建议不一致,让我对最佳实践感到困惑。另外,如果想让第一种目录结构生效,是否可以修改setup.cfg,比如在
[options.packages.find]的where = src中添加data? - 之前根据相关文档在data文件夹中添加了
__init__.py,但后来得知这已被弃用,移除后可成功读取文件,确认不再需要该文件。 - 关于pkgutil,是不是从Python 3.9开始importlib更受青睐?
内容的提问来源于stack exchange,提问作者BdB
相关产品推荐
相关产品推荐

