【问题标题】:Preferred way to store/retrieve python data存储/检索python数据的首选方式
【发布时间】:2010-01-24 19:24:37
【问题描述】:

我想在 Python 包中包含数据文件。是按照here 的建议将它们放入实际包中的最佳位置,即

setup.py
src/
    mypkg/
        __init__.py
        module.py
        data/
            tables.dat
            spoons.dat
            forks.dat

或者有没有更好的方法来做到这一点?从python内部检索数据文件的最佳方法是什么?我应该使用

mypkg.__path__ + 'data/tables.dat'

例如,或者我应该使用

pkgutil.getdata('mypkg','tables.dat')

或者,还有其他更好的方法可以做到这一点吗?

一般来说,目前处理 Python 包中数据的首选方式是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    pkgutil 意味着即使软件包安装在 ZIP 文件中,您也可以加载数据,因此如果您想支持它,则更可取。将它存储在这样的数据目录中很好,我一直都这样做。 :)

    【讨论】:

      【解决方案2】:

      您应该通过 Pickle 模块将数据存储为 Python 数据结构。这样,当你调用它(加载它)时,数据就可以使用了,你不需要在每个脚本中处理它。

      至于位置,以对用户透明和清晰的方式存储它是有道理的,以下对我来说似乎很直观:

      from package import data
      

      【讨论】:

      • 这并不能真正回答问题,因为腌制数据仍然需要在某种数据文件中。而且“应该”在这里也是一个强有力的词。您可以将其存储为 pickle 文件,但这会使其难以编辑,例如。通常 csv 更好。此外,像这样存储的常见数据是图像文件。没有理由把它们做成泡菜。
      • @Lennart:我认为你没有明白酸洗数据的意义,“这样当你加载它就可以使用了”我想你明白这意味着什么,但以防万一,我会说明:如果您存储为 csv 文件,那么您需要实现一个阅读器并将每一行存储在一个列表中(假设您需要一个列表)。如果你腌制它,那么你直接调用列表,并保存“创建列表”步骤。至于“难以编辑”的部分,嗯,是数据,对吧?如果需要编辑,直接在列表上编辑,重写pickle即可。这不就是数据序列化的意义所在吗?
      • 酸洗并不完全安全 - nadiana.com/python-pickle-insecure。此外,它是特定于 Python 的,就像 Lennart 所说的那样,不能手动破解(这总是一件有用的事情)。最好使用 JSON 等与语言无关的格式。此外,这只是谈论“数据格式”而不是 OP 想要的“数据位置”。
      • 我认为 CSV 不是安全标准
      • CSV 更安全,因为它完全是数据。如果您的应用程序不信任它,那很好。 Pickle 文件在加载时进行评估,并且可以设计为在解码时执行恶意代码。这更难检测。
      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 2012-06-23
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2011-12-30
      相关资源
      最近更新 更多