2012-07-25 64 views
15

我有一個運行並創建三個字典的過程:2個很小,1個大。如何cPickle轉儲並將單獨的字典加載到同一個文件?

我知道我可以存儲一個字典,如:

import cPickle as pickle 
with open(filename, 'wb') as fp: 
    pickle.dump(self.fitResults, fp) 

我希望做的是存儲的所有3本詞典在同一個文件中,在三個字典分別在其他時間加載能力。類似於

with open(filename, 'rb') as fp: 
    dict1, dict2, dict3 = pickle.load(fp) 

或者甚至更好的只是加載前兩個字典,並使其可選是否加載第三個(大)字典。這是可能的還是應該以完全不同的方式來解決這個問題?

+0

你在哪裏立即下載了cPickle,即時通訊尋找它..沒有找到它。 – Tekkzz 2013-12-23 21:58:15

回答

21

當然,你只是單獨傾倒每一個,然後分別裝入其中:

with open(filename,'wb') as fp: 
    pickle.dump(dict1,fp) 
    pickle.dump(dict2,fp) 
    pickle.dump(dict3,fp) 

with open(filename,'rb') as fp: 
    d1=pickle.load(fp) 
    d2=pickle.load(fp) 
    d3=pickle.load(fp) 

確保轉儲大上最後一個,所以你可以加載的小傢伙沒有先加載大單。我想你甚至可以聰明地存儲每個轉儲開始的文件位置,然後你可以在加載之前找到這個位置(但是現在開始變得更復雜了)。

4

我推薦經常遺忘的shelve模塊,它可以有效地爲您提供由Berkley DB文件或dbm文件(由anydbm選擇)支持的持久字典。數據庫應該提供性能改進(對於你的大字典)。

實例:

import shelve 
shelf = shelve.open('my_shelf') 
>>> shelf 
{} 

# add your dictionaries (or any pickleable objects) 
shelf['dict1'] = dict(a=10, b=20, c=30, l=[10, 20, 30]) 
shelf['dict2'] = dict(a=100, b=200, c=300, l=[100, 200, 300]) 
shelf['dict3'] = dict(a=1000, b=2000, c=3000, l=[1000, 2000, 3000]) 

>>> shelf 
{'dict1': {'a': 10, 'c': 30, 'b': 20, 'l': [10, 20, 30]}, 'dict3': {'a': 1000, 'c': 3000, 'b': 2000, 'l': [1000, 2000, 3000]}, 'dict2': {'a': 100, 'c': 300, 'b': 200, 'l': [100, 200, 300]}} 
shelf.close() 

# then, later 
shelf = shelve.open('my_shelf') 
>>> shelf 
{'dict1': {'a': 10, 'c': 30, 'b': 20, 'l': [10, 20, 30]}, 'dict3': {'a': 1000, 'c': 3000, 'b': 2000, 'l': [1000, 2000, 3000]}, 'dict2': {'a': 100, 'c': 300, 'b': 200, 'l': [100, 200, 300]}} 
3

如前所述here,可以醃製多個對象到相同的文件中,並加載它們所有(以相同的順序):

f = file(filename, 'wb') 
for obj in [dict1, dict2, dict3]: 
    cPickle.dump(obj, f, protocol=cPickle.HIGHEST_PROTOCOL) 
f.close() 

然後:

f = file(filename, 'rb') 
loaded_objects = [] 
for i in range(3): 
    loaded_objects.append(cPickle.load(f)) 
f.close() 

你可以保存你的字典在一個特定的順序,以便加載它們時,you'v e選擇僅選擇首選的選項。

對於例如,如果您存儲在訂單詞典:smallDict1smallDict2largeDict1
您可以通過設置適當的範圍,同時加載
(這裏for i in range(2) ...)只裝入小的

相關問題