2016-03-22 13 views
2

最後にピクルされたオブジェクトからピクルされたオブジェクトをロードするために、複数のオブジェクトを逆にアンピクルする方法はありますか?例えば逆順でアンピール

: '文字列2'、 '文字列1':

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

各unpickle化をunpickle化して印刷した後、私は見てみたいと思います。

答えて

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'がシリアル化できるオブジェクトで)。私の編集を参照してください。しかし、他の "データパーシスタンス"モジュールを使用するあなたのソリューションも動作するはずです。 –