【问题标题】:save/load dictionary while conserving keys' datatype [duplicate]在保存键的数据类型的同时保存/加载字典[重复]
【发布时间】:2016-09-25 14:53:18
【问题描述】:

我想保存一个包含字符串和整数键以及多个数据类型值的字典。例如:

dData = {
    'a': ['c','d'],
    1: [5.1, 3.1]
}

为了保存和加载它,我使用了json.dumpjson.load,但是,我的整数键在加载时会转换为字符串。

我不想更改字典的创建方式,因为将这些键保存为整数对我来说非常方便。

如何将字典保存到文件中,然后在保存类型的同时再次加载?

【问题讨论】:

  • @glls 这个问题解释了为什么使用 json 不适合他的问题,但如答案所示,还有其他方法可以满足 OP 的问题(“我如何保存字典归档并再次加载它......”)而不必使用 json

标签: python json dictionary


【解决方案1】:

感谢其他问题等的指针,尽管 use picke 的极其简单的答案在任何地方都没有(为什么会这样;我错过了一个细节吗?)。

sTestDataPath = "/path/to/data/test_data.p"
import pickle


with open(sTestDataPath, 'w') as f:
    pickle.dump(dInputData, f)

with open(sTestDataPath, 'r') as f:
    dInputData = pickle.load(f)

【讨论】:

  • 我写了你可以在我的答案中使用pickle,但是它有一些缺点,主要是你需要一次加载整个字典,在大数据集的情况下会消耗大量内存.第二个主要错误是,如果您希望更改单个值,则重新编写整个字典。请记住 - 磁盘访问是程序中最慢的部分之一,因此您希望它高效。如果 pickle 是基于磁盘的字典的更好选择,那么标准库中就不存在 shelve :-)
  • @Bharel 我明白了,感谢您的解释。在我的具体情况下,效率并不是主要的必要条件。但现在我有你的答案以供将来参考:)
  • 当然。由于按需保存,但正如您所寻求的那样,它也更安全。祝你好运! :-)
【解决方案2】:

我建议为此使用shelve 模块。

Shelve 允许您将任意 python 对象的字典存储在磁盘文件中。

他们的文档中的一个例子:

with shelve.open('spam') as db:
    db['eggs'] = 'eggs'

它不回答你的整数键的情况,你可以创建一个搁置的子类,将整数转换为字符串或完全使用泡菜。

这是一个子类示例:

from shelve import DbfilenameShelf

class IntShelf(DbfilenameShelf):

    def __getitem__(self, key):
        # Not isinstance as we wish to be specific
        if type(key) == int:
            key = "i" + str(key)
        elif type(key) == str:
            key = "s" + key
        else:
            raise TypeError

        return super().__getitem__(key)

    def __setitem__(self, key, value):
        if type(key) == int:
            key = "i" + str(key)
        elif type(key) == str:
            key = "s" + key
        else:
            raise TypeError

        return super().__setitem__(key, value)

用法:

>>> db = IntShelf("testdb")
>>> db["123"] = "foo"
>>> db[123] = ["bar", "bar", "bar"]
>>> db["123"]
'foo'
>>> db[123]
['bar', 'bar', 'bar']

请记住,使用 pickle 而不是 shelve 来存储字典有很多缺点:

  1. 您需要一次加载整个字典,如果数据集很大,会消耗大量内存。
  2. 更改单个值需要重写整个字典。
  3. Shelve 的界面比到处使用 pickle 更简洁,并且具有内部缓存以实现最高效率。
  4. 万一程序在中间崩溃,如果你没有用finally 子句包装整个东西,你将失去数据库,而在搁置中,数据库是按需保存的。

请记住,磁盘访问是程序中最慢的部分之一,因此您希望将其最小化。

【讨论】:

  • 搁置只是一个泡菜包装。这不能回答 JSON 问题恕我直言?
  • @PhilippeOmbredanne 他没有寻找特定于 JSON 的方式。他寻找一种方法来在磁盘上存储带有添加整数键的字典。 OP 认为 JSON 可能会有所帮助,但我相信 shelve 是一种更好、更通用、更有效的解决方案。
  • 好点!对于纯 Python 到 Python,这可以正常工作
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2020-02-26
相关资源
最近更新 更多