2016-03-22 143 views
2

有沒有任何方法反向取消多個對象,以便從最後一個pickle中加載pickle對象?unpickle以相反的順序

例如:

import pickle 
a = 'string1' 
b = 'string2' 
with open('test', 'wb') as f: 
    pickle(a, f) 
    pickle(b, f) 

取儲存和打印每個在unpickle後,我想看到的: '字符串2', '字符串1'。

回答

2

一起使用pickledbm。此代碼適用於python2和python3(在Raspbian linux上測試)

import pickle 
import dbm 

OBJECTS = (
    'string1', 
    'string2', 
) 

def store(): 
    db = dbm.open('test','c') 
    index = 0 
    for ob in OBJECTS: 
    db[str(index)] = pickle.dumps(ob) 
    index += 1 
    db['N'] = str(index) # store object count 
    db.close() 

def load(): 
    db = dbm.open('test','r') 
    nb = int(db['N']) 
    while nb>0: 
    nb -= 1 
    ob = pickle.loads(db[str(nb)]) 
    print (ob) 
    db.close() 

store() 
load() 

鍵'N'表示存儲了多少個對象。這應該適用於大量的對象。

編輯

這並不侷限於字符串,它也將與任何對象pickle可序列化工作。例如,你可以寫

OBJECTS = (
    ('A', 'b', '123'), 
    'SomeString', 
    {1: 'ABC', 2:((1,2),(3,4)), 3: [9,8,7,6]}, 
    [[],[1],[2,3],[4,5,6]], 
) 
+0

Thanks @ sci-prog!這不太符合我的需求,因爲我將存儲數組而不是字符串(我知道,我應該讓我的初始問題更加明確,我的玩具示例更少玩具),但是您對dbm的建議讓我指出了正確的方向。我認爲我最終會使用python的shelve或sqlite3。 – itf

+0

這適用於列表(實際上,任何'pickle'可以序列化的對象)。看我的編輯。但是使用其他「數據持久性」模塊的解決方案也應該可行。 –