腌制多个词典

时间:2013-08-07 22:05:34

标签: python python-3.x pickle

所以我是python的新手,在整个学习过程中我很可能会问很多菜鸟问题(如果他们当然没有被问过/回答过)。

我遇到的一个问题是,是否有办法使用pickle将多个词典保存到一个文本文件,或者每个字典是否必须保存到它自己的单独文件中。例如,如果我想创建一个管理Web帐户的程序,每个帐户都有各种任意键/值,我可以将所有这些个人帐户保存为一个存档作为单独的词典吗?

提前致谢,noob会感谢示例代码和/或任何建议。

2 个答案:

答案 0 :(得分:6)

一个快速的解决方案是将两个字典放在一个列表中,然后选择列表。

这是一个将其写为二进制文件的示例。

    import cPickle as pkl

    MyFirstDict = { "hat": 7, "carpet": 5 }
    MySecondDict = { "syrup":15, "yogurt": 18 }

    MyDicts = [MyFirstDict, MySecondDict]

    pkl.dump( MyDicts, open( "myDicts.p", "wb" ) )

这是一个加载它。

    import cPickle as pkl

    myDicts = pkl.load( open ("myDicts.p", "rb") )

如果您需要该文件是人类可读的,请考虑将其写为常规文本文件。请注意,效率低得多,并且数据尤其暴露在网络帐户数据之类的内容中。

    MyFirstDict = { "hat": 7, "carpet": 5 }
    MySecondDict = { "syrup":15, "yogurt": 18 }

    MyDicts = [MyFirstDict, MySecondDict]

    outputFile = open( "myDicts.txt", "w")
    outputFile.write(str(MyDicts))
    outputFile.flush()
    outputFile.close()

并在...中读回来。

    import ast

    inputFile = open( "myDicts.txt", "r")
    lines = inputFile.readlines()

    objects = []
    for line in lines:
        objects.append( ast.literal_eval(line) )

    myDicts = objects[0]

参考文献:

//参考pickle http://wiki.python.org/moin/UsingPickle

//文本到对象解决方案的来源 Python convert string object into dictionary

答案 1 :(得分:0)

有几种方法可以腌制多个物体。哪个最好将取决于您的用例。

一种选择是将所有单独的帐户词典放入更大的数据结构中,例如列表或字典(可能由帐户ID键入)。然后你挑选更大的数据结构,帐户数据将一次性保存。请注意,Pickle的格式是二进制格式,而不是文本格式。如果你想要人类可读的东西,你应该使用jsonyaml代替。

另一个选择是按顺序将多个pickle值写入文件。这非常符合您的预期,只需反复调用pickle.dump来保存它们,然后pickle.load重复加载它们。这种方法的一个缺点是您无法轻易搜索到您需要的特定数据项,您需要按顺序加载它们,直到找到所需的数据项。另一个是被腌制多次的对象的身份将会丢失(加载它们时,值可能相等,但不会引用同一个对象)。一个优点是你可以将更多的数据附加到文件的末尾,而无需读取以前的内容,只是再次写出来。

第三种选择是使用标准库中的shelve模块。它的行为有点像字典,但键和值被腌制到文件中。它可以解决上面单独的pickle的查找问题,但它不能解决值之间对象标识的丢失。

最后的想法是根本不使用pickle,而是使用真正的数据库系统。这可能有点难以编码,但可能会让您避免可能难以解决的并发和数据完整性问题。