从包内的文件夹加载数据

loading data from folder inside package

我在一个包(pip 可安装)的文件夹(比如 data_pkl)中有一些 .pkl 文件,我想将这些文件加载​​到一些 .py 外部包中。但是,我不确定是否要关注

  1. 我应该写MANIFEST.in文件吗
  2. 是否需要在 setup.py 文件中进行任何更改
  3. 我需要将 __init__.py 放入 data_pkl 文件夹中吗
  4. 如何使用包将 .pkl 文件导入到 python 脚本中。

编辑: include_package_data=Truesetup.py.

如果设置为 True,这会告诉 setuptools 自动包含它在您的包目录中找到的任何数据文件,这些文件要么在 CVS 或 Subversion 控制下,要么由您的 MANIFEST.in 文件指定。这回答了 1 和 2。

.pkl数据大概是使用picklepython模块序列化的数据。它不能被导入。您必须反序列化数据。

import pickle
data = pickle.load(open("data.pkl", "rb"))

如其他答案所述,您可以将其包装在 python 模块中。

# filename: data.py
import pickle

def load_data(filename):
    return pickle.load(open(filename, "rb"))

如果您的 .pkl 文件在 python 包中,您可以使用 pkg_resources.

检索它
import pickle
import pkg_resources

def load_data(resource_name):
    return pickle.load(
        pkg_resources.resource_stream("my_package", resource_name))

在 python >= 3.7 中,可以使用 importlib.resources 检索数据以防止使用第三方包。

data = pickle.load(
    importlib.resources.open_binary("my_package.data_folder", "data.pkl"))