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

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的语法让我感到困惑。


补充疑问

  1. 能否详细说明相对导入与importlib的使用区别?
  2. 既然数据本质上属于foo包,是否应该采用如下包结构?
foo
├── setup.cfg
└── src
    └── foo
        ├── data
        │   ├── __init__.py
        │   └── data.csv
        │       └── data2
        │           ├── __init__.py
        │           └── data2.csv
        ├── __init__.py
        └── bar.py
  1. 我的使用场景:用户安装包后,可利用data.csv和data2.csv中的数据进行计算,这些数据会被解析为pandas DataFrames。这是否是为用户提供包及所需数据的正确方式?
  2. 某示例与相关建议不一致,让我对最佳实践感到困惑。另外,如果想让第一种目录结构生效,是否可以修改setup.cfg,比如在[options.packages.find]的where = src中添加data?
  3. 之前根据相关文档在data文件夹中添加了__init__.py,但后来得知这已被弃用,移除后可成功读取文件,确认不再需要该文件。
  4. 关于pkgutil,是不是从Python 3.9开始importlib更受青睐?

内容的提问来源于stack exchange,提问作者BdB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:31:24