【问题标题】:Pickling multiple dictionaries酸洗多个字典
【发布时间】:2013-08-07 22:05:34
【问题描述】:

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

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

提前致谢,菜鸟将不胜感激示例代码和/或任何建议。

【问题讨论】:

    标签: python python-3.x pickle


    【解决方案1】:

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

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

        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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-03
        • 2014-09-15
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        相关资源
        最近更新 更多