如何在 Python 包中创建和加载内部数据



我正在开发一个 Python 包,Python 包的实现取决于一些研究结果。我将我的研究结果保存在Python字典中。我有两个问题:

  1. 如何将此字典保存为我的包中的内部数据?
  2. 在包中写入函数时,如何加载此内部数据?

我对此进行了研究,但仍然无法了解如何从头开始保存包内部数据。它也没有显示如何加载保存的内部数据。R中有类似devtools::use_data的东西吗?

这就是我通常对带有pip的标准python3发行版所做的(它反映了一点R数据分布(。

  1. 在您的代码目录中为数据创建一个文件夹,我们称之为"my_data"。 在这里你可以放任何你想要的东西:csv,json,pickle... 但请注意,Pickle 在加载到 Python 版本(而不是用于创建它的版本(时可能会出现一些问题。 pickle 也存在一些安全问题,因此如果您要分发软件包,请选择另一种格式。

然后,如果你的包被调用,例如"my_data_pack",你将有这个文件夹结构:

.
├── my_data_pack
│   ├── __init__.py
│   └── my_data
│       └── data_file.txt
└── setup.py
  1. 包含以下行 在setup函数中,您的setup.py文件:
from setuptools import setup, find_packages
setup(
name='my_data_pack',
packages=find_packages(),
package_data={'my_data_pack': ['my_data/*']}
)

这将使数据在为 pip 构建时包含在 tar.gz 分发文件中。 根据您的包结构,您可能需要将行更改为类似package_data={'mypkg': ['my_data/*.dat']},如您提到的链接所示。

  1. 最后也是棘手的事情是如何使包中的模块在安装时查找数据集。 这个想法是首先在安装包的目录中找到数据文件,然后将数据加载到模块中。 要查找数据文件,您可以使用ospkg_resources

要在__init__.py文件(或正在使用的任何其他子模块(中包含os这些行,请执行以下操作:

import os
location = os.path.dirname(os.path.realpath(__file__))
my_file = os.path.join(location, 'my_data', 'data_file.txt')
with open(my_file) as fin:
my_data_object = fin.readlines()

或者这些,如果你更喜欢使用pkg_resources

import pkg_resources
my_file = pkg_resources.resource_filename('my_data_pack', 'my_data/data_file.txt')
with open(my_file2) as fin:
my_data_object = fin.readlines()

更改readlines部分以读取您自己的数据格式。这就是包代码所需的全部内容。

  1. 要使库分发,我运行:
python3 setup.py sdist

这将创建一个名为"dist"的新目录,其中包含 at tar.gz 文件。 然后,您可以将软件包安装为

pip3 install dist/my_data_pack-0.0.0.tar.gz

要访问 python 会话中的数据,您需要执行以下操作:

import my_data_pack
print(my_data_pack.my_data_object)

在旧的R时代(devtools:)之前您将使用带有选项的system.file函数package要查找已安装库的位置,然后加载数据...类似于蟒蛇os.path.realpah的东西.

Python 3.4 将pathlib模块添加到标准库中,这使得处理文件和目录位置更加优雅。

要获取安装软件包的目录,您可以将以下内容包含在您的__init__.py中:

from pathlib import Path
PACKAGEDIR = Path(__file__).parent.absolute()

要获取包目录中文件的路径,可以按如下方式构造路径:

my_file = PACKAGEDIR / 'my_data' / 'data_file.txt'

最新更新