【问题标题】:Proper way to save python dictionaries and retrieve them at a later stage保存python字典并在稍后阶段检索它们的正确方法
【发布时间】:2013-08-27 13:44:35
【问题描述】:

在我之前在这里提出的一个问题 (Most appropriate way to combine features of a class to another?) 之后,我得到了一个我终于明白的答案。简而言之,我现在打算拥有一堆字典,每个字典看起来有点像这样:

{ "url": "http://....", "parser": SomeParserClass } 

虽然以后可能会添加更多属性,但会包括字符串或其他一些类。 现在我的问题是:保存这些对象的最佳方法是什么?

我想出了 3 个解决方案,不知道哪个是最好的,以及是否还有其他更可接受​​的解决方案。

  1. 使用 pickle,虽然使用它似乎很有效,但编辑任何这些字典都会很痛苦,因为它是以二进制格式保存的。

  2. 将每个字典保存在单独的模块中并从单个目录中动态导入这些模块,每个模块内部都有一个函数来返回字典或特制的变量名称来保存它,以便我可以调用它从我的加载代码。这似乎更容易编辑,但听起来不是很有效或 python

  3. 使用 MongoDB 或 Riak 之类的某种数据库来保存这些对象,我对这个的问题是编辑是可行的,但听起来并不有趣,而且前 2 个都配备了用于正确地将我的解析器类保存在字典中,我不知道这些数据库如何序列化或“腌制”这些对象。

如您所见,我主要关心的是编辑它们的难易程度、保存和检索数据的效率(虽然不是一个大问题,因为我只有几百个这样的数据)以及解决方案的正确性.

那么,有什么想法吗?

提前感谢您提供的任何帮助。

【问题讨论】:

  • 你可以考虑json。它支持python字典。它们也可以轻松编辑。
  • 可能有很多您没有告诉/不能告诉我们的细节会影响您的决定。键总是相同的类型吗?您的数据本质上是有限的吗?然后使用 JSON。如果不是,类型转换可能会导致键冲突。 Pickle 对于保存可散列的可执行对象特别有用,它在递归引用方面很聪明,但它也可能是一个漏洞。 “序列化 Python 数据的最佳方式是什么?”这实际上不是一个主观问题,但它对您要序列化的数据的性质高度敏感。

标签: python oop pickle


【解决方案1】:

使用 JSON。支持python字典,编辑方便。

【讨论】:

  • 请注意,Python 字典不能完美地映射到 JSON。特别是尝试json.loads( json.dumps( {15: "a", "15": "b"} ) )。
  • 另外,您将不得不为parser 值中的类定义特殊处理。 JSON 或多或少是 Python 字典的一个子集; JSON 可以表示为字典,但并非所有字典都可以透明地表示为 JSON。
  • 我不确定您为什么要使用单独的文件或 Python 模块。这基本上听起来像静态配置数据,它应该存在于一个或最多很少的文件中(或者如果你有很多需要管理的文件,一个数据库)。除非您在运行时动态设置任何这些,否则您不需要任何复杂的东西。 yaml、JSON 或其他格式的配置文件可以正常工作。以这种方式使用直接的 Python 模块甚至都不是闻所未闻的(Django configs 和 setup.py 在较小程度上浮现在脑海中)。
  • 要更直接地回答,除非您对如何或在何处存储数据有特定的系统要求,否则这更多的是个人风格和软件一致性的问题,而不是任何最佳实践。如果文件中已有配置数据,请使用该文件或其他文件。如果您在数据库中有一些,请使用现有的或新的表。只需选择一个并在整个应用程序中坚持使用它。
  • 我看不出有什么问题。代码的一个重要方面是它适合你。很多东西没有标准的实现方式,所以做一些你觉得舒服的事情。
【解决方案2】:

你可以试试shelve。它建立在pickle 之上,让您可以序列化对象并将它们与字符串键相关联。

因为它基于dbm,它只会在您需要时访问键/值。因此,如果您只需要访问大型字典中的几个项目,shelve 可能是比json 更好的选择,json 必须先将整个 JSON 文件加载到字典中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多