6

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

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

在此先感谢,菜鸟会欣赏示例代码和/或任何建议。

4

2 回答 2

11

一种快速的解决方案是将两个字典放在一个列表中,然后腌制该列表。

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

    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]

参考:

// 泡菜参考 http://wiki.python.org/moin/UsingPickle

// 文本到对象解决方案的来源 Python 将字符串对象转换为字典

于 2013-08-07T22:55:10.577 回答
1

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

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

另一种选择是按顺序将多个泡菜值写入文件。这几乎可以像您期望的那样工作,只需pickle.dump反复调用以保存它们,然后pickle.load反复将它们重新加载。这种方法的一个缺点是您无法轻松搜索所需的特定数据项,您需要继续按顺序加载它们,直到找到您想要的。另一个是多次腌制的对象的身份将丢失(加载它们时值可能相等,但不是对同一对象的引用)。一个优点是您可以将更多数据附加到文件的末尾,而无需读取以前的内容,只需再次将其写出即可。

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

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

于 2013-08-07T22:55:52.810 回答