2010-08-04 118 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