2010-08-04 85 views
1

我不知道为什么这个Pickle示例没有显示两个字典定义。据我了解,“ab +”应该表示pickle.dat文件被附加到并可以从中读取。我对整个泡菜概念并不熟悉,但网络上的教程似乎并不仅限于初始存储。Python Pickle帮助

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循环的字典,然后键添加:值对的pickle.dat文件,然后清除字典节省一些RAM。

这是怎么回事?

+0

不要双击空格你的代码。而是用四个空格缩进。 – 2010-08-04 16:32:43

回答

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 
+0

哦,我的我的gosh !!!那个dbm模块看起来棒极了!非常感谢你!!!!我肯定会试试! – Brian 2010-08-04 17:31:31

+0

另请注意:根据Python网站: “dbm模块已被重命名为dbm。 ndbm in Python 3.0.2to3工具将自动适应导入时,将您的源代码转换为3.0“ – Brian 2010-08-04 17:40:58

+0

此外,我只是注意到,这是一个Unix模块,我编码在Windows 7 .... – Brian 2010-08-04 17:43:15

3

我开始编辑您的代码以提高可读性,并在此过程中将其分解为append_object

这里有很多混乱。第一个是,pickle.dump完整地写了一个Python对象。您可以将多个对象放在一个pickle文件中,但每个对象都需要自己的load。代码完成了你对它的要求,并加载了你写入文件的第一个字典。第二个字典在那里等待被读取,但它不是第一个字符串,而是它自己的可载入字符串。

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

如果您打开一个阅读文件,只需将其打开以便阅读并且同样用于书写或附加。它不仅使你的意图更清晰,而且可以防止愚蠢的错误。

+0

感谢您将我的代码放入代码块中...我一直在试图弄清楚。你是怎样做的?根据参考资料,它看起来像我只是在我想要在代码块中的开始和结束时键入一个单引号字符。但是这对我并不适用... =( – Brian 2010-08-04 17:30:02

+0

@Brian,你可以在代码中做到这一点,对于大块代码,你可以在每行代码的开头添加四个空格,或者你可以简单地编写代码没有空格,突出显示它,然后单击看起来像1和0的“代码示例”按钮。 – Wilduck 2010-08-04 18:37:05

+0

我仍然不确定如何修改上面的代码以将两个定义都保存在pickle文件中... – Brian 2010-08-04 19:18:52