首选的存储/检索Python数据的方式

3

我想在一个Python软件包中包含数据文件。最好的位置是像这里建议的那样将它们放在实际包内吗?

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包内处理数据的当前首选方法是什么?

2个回答

3

pkgutil意味着即使软件包被安装在ZIP文件中,您也可以加载数据,因此如果您想支持这一点,它是首选。像那样将其存储在数据目录中是可以的,我经常这样做。 :)


-2

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

至于位置,存储方式应该对用户来说是透明和清晰的,以下方式对我来说很直观:

from package import data

这并没有真正回答问题,因为腌制的数据仍然需要在某种数据文件中。而且,“应该”在这里是一个强烈的词。你可以将其存储为pickle文件,但例如编辑就会很困难。通常csv更好。此外,像图像文件这样的常见数据不需要进行腌制。 - Lennart Regebro
@Lennart:我想你没有理解“将数据进行pickling可以使其在加载时准备好使用”的意义。我认为您应该理解这意味着什么,但以防万一,我来解释一下:如果您将其存储为csv文件,则需要实现一个读取器并将每行存储在列表中(假设您需要一个列表)。如果您对其进行pickling,则直接调用该列表,而且您可以省去“创建列表”的步骤。至于“难以编辑”的部分,那是数据,对吧?如果您需要编辑它,只需直接在列表上编辑并重新编写pickle即可。这不就是数据序列化的全部意义吗? - Escualo
我认为CSV不是安全标准。 - Escualo
CSV更加安全,因为它是完全的数据。如果您的应用程序不信任它,那没问题。Pickle文件在加载时进行评估,并且可以被设计成在解码时执行恶意代码。这很难检测到。 - Noufal Ibrahim
CSV和Pickle在某种程度上是相同的。它们都是序列化格式,用于持久化数据。由于Pickle被视为代码,因此它是一种不安全的格式。关于“准备好使用”等方面的讨论都是实现细节,不会对问题产生贡献。此外,你的回答并没有真正解决问题。-1。 - Noufal Ibrahim
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接