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

use*_*758 2 python module package python-3.x python-internals

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

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

我研究了这个,但仍然不知道如何从头开始保存包内部数据。它也没有显示如何加载保存的内部数据。devtools::use_data在 R 中有类似的东西吗?

dmo*_*ner 6

这就是我通常使用 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

Run Code Online (Sandbox Code Playgroud)
  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/*']}
)
Run Code Online (Sandbox Code Playgroud)

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

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

os在您的__init__.py文件(或您正在使用的任何其他子模块)中使用这些行:

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()

Run Code Online (Sandbox Code Playgroud)

或者这些,如果你喜欢使用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()

Run Code Online (Sandbox Code Playgroud)

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

  1. 为了使我运行的库分发:
python3 setup.py sdist
Run Code Online (Sandbox Code Playgroud)

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

pip3 install dist/my_data_pack-0.0.0.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

import my_data_pack
print(my_data_pack.my_data_object)
Run Code Online (Sandbox Code Playgroud)

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