从包内的文件夹加载数据
loading data from folder inside package
我在一个包(pip 可安装)的文件夹(比如 data_pkl
)中有一些 .pkl
文件,我想将这些文件加载到一些 .py
外部包中。但是,我不确定是否要关注
- 我应该写
MANIFEST.in
文件吗
- 是否需要在
setup.py
文件中进行任何更改
- 我需要将
__init__.py
放入 data_pkl
文件夹中吗
- 如何使用包将 .pkl 文件导入到 python 脚本中。
编辑:
include_package_data=True
在 setup.py
.
如果设置为 True,这会告诉 setuptools 自动包含它在您的包目录中找到的任何数据文件,这些文件要么在 CVS 或 Subversion 控制下,要么由您的 MANIFEST.in 文件指定。这回答了 1 和 2。
.pkl
数据大概是使用pickle
python模块序列化的数据。它不能被导入。您必须反序列化数据。
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"))
我在一个包(pip 可安装)的文件夹(比如 data_pkl
)中有一些 .pkl
文件,我想将这些文件加载到一些 .py
外部包中。但是,我不确定是否要关注
- 我应该写
MANIFEST.in
文件吗 - 是否需要在
setup.py
文件中进行任何更改 - 我需要将
__init__.py
放入data_pkl
文件夹中吗 - 如何使用包将 .pkl 文件导入到 python 脚本中。
编辑:
include_package_data=True
在 setup.py
.
如果设置为 True,这会告诉 setuptools 自动包含它在您的包目录中找到的任何数据文件,这些文件要么在 CVS 或 Subversion 控制下,要么由您的 MANIFEST.in 文件指定。这回答了 1 和 2。
.pkl
数据大概是使用pickle
python模块序列化的数据。它不能被导入。您必须反序列化数据。
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"))