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

时间:2019-09-01 18:00:25

标签: python python-3.x module package python-internals

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

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

我调查了this,但仍然不知道如何从头开始保存程序包内部数据。它也没有显示如何加载保存的内部数据。 R中是否有类似devtools::use_data的东西?

2 个答案:

答案 0 :(得分:0)

这通常是我通过pip对标准python3分发所做的工作(它镜像了R数据的分发)。

  1. 在您的代码目录中,为数据创建一个文件夹,将其称为“ my_data”。 在这里您可以放置​​任何您想要的东西:csv,json,pickle ... 但请注意,将pickle加载到python版本中(而不是用来创建它的版本)时,可能会遇到一些问题。 泡菜还有一些安全性问题,因此,如果要分发包装,请选择其他格式。

然后,如果您的软件包被称为“ my_data_pack”,则您将具有以下文件夹结构:

defmodule CandleManager.Bitfinex.Realtime.Supervisor do
  use Supervisor

  alias CandleManager.Bitfinex.Realtime

  require Logger
  def start_link(args) do
    Supervisor.start_link(__MODULE__, args, name: __MODULE__)
  end

  @impl Supervisor
  def init([market_manager_pid: _pid] = args) do
    childrens = [
      {Realtime.Websocket.Server, []},
      {Realtime.Manager.Server, []},
      {Realtime.TradeToCandle.Server, []},
      {Realtime.TradeDiscarder.Server, args}
    ]

    Supervisor.init(childrens, strategy: :one_for_all, max_restarts: 0)
  end
end
  1. 在您的. ├── my_data_pack │   ├── __init__.py │   └── my_data │   └── data_file.txt └── setup.py 文件的setup函数中包括以下行:
setup.py

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

  1. 最后一个棘手的事情是如何在安装时使包中的模块查找数据集。 这个想法是首先在安装包的目录中找到数据文件,然后将数据加载到模块中。 要找到数据文件,您可以使用package_data={'mypkg': ['my_data/*.dat']},os

要使用pkg_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() 的这些:

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() 部分以读取您自己的数据格式。这就是打包代码所需的全部内容。

  1. 要运行库分发,请运行:
readlines

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

python3 setup.py sdist

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

pip3 install dist/my_data_pack-0.0.0.tar.gz

在旧的R时代(在import my_data_pack print(my_data_pack.my_data_object) 之前),您可以使用devtools函数和选项system.file 来找到已安装库的位置,然后加载数据...类似于python package

答案 1 :(得分:0)

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

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

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

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

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