Python Pickle帮助

时间:2010-08-04 16:30:20

标签: python pickle

我不确定为什么这个Pickle示例没有显示两个字典定义。据我了解,“ab +”应该意味着pickle.dat文件被附加到并且可以从中读取。我是整个泡菜概念的新手,但网上的教程似乎不仅仅是初始存储。

import cPickle as pickle

def append_object(d, fname):
    """appends a pickle dump of d to fname"""
    print "append_hash", d, fname
    with open(fname, 'ab') as pickler:
        pickle.dump(d, pickler)

db_file = 'pickle.dat'

cartoon = {}
cartoon['Mouse'] = 'Mickey'
append_object(cartoon, db_file)

cartoon = {}
cartoon['Bird'] = 'Tweety'
append_object(cartoon, db_file)

print 'loading from pickler'
with open(db_file, 'rb') as pickler:
    cartoon = pickle.load(pickler)
print 'loaded', cartoon

理想情况下,我希望使用for循环构建字典,然后将key:value对添加到pickle.dat文件,然后清除字典以节省一些RAM。

这里发生了什么?

2 个答案:

答案 0 :(得分:5)

不要使用泡菜。使用数据库。

Python dbm module似乎完全符合您的要求。它为您提供类似字典的界面,但数据保存到磁盘。

使用示例:

>>> import dbm
>>> x = dbm.open('/tmp/foo.dat', 'c')
>>> x['Mouse'] = 'Mickey'
>>> x['Bird'] = 'Tweety'

明天您可以加载数据:

>>> import dbm
>>> x = dbm.open('/tmp/foo.dat', 'c')
>>> print x['Mouse']
Mickey
>>> print x['Bird']
Tweety

答案 1 :(得分:3)

我开始编辑您的代码以提高可读性,并在此过程中考虑append_object

这里存在多种混淆。第一个是,pickle.dump完整地编写了一个Python对象。您可以在pickle文件中放置多个对象,但每个对象都需要自己的load。代码完成了你的要求,并将你写的第一个字典加载到文件中。第二本字典在那里等待阅读,但它不是第一本字典的连接,它是自己的可加载的。

不要低估名字的重要性。 append_object不是一个好名字,但它与append_to_object不同。

如果您要打开一个文件进行阅读,只需打开它进行阅读,然后再进行书写或追加。它不仅可以使你的意图更清晰,而且可以防止愚蠢的错误。