2012-07-25 9 views
15

私は実行して3つの辞書を作成しています.2つは小さく、もう1つは大きくなっています。別の辞書を同じファイルにダンプして読み込む方法を教えてください。

私は私が好きな辞書を保存することができます知っている:私がやりたいのは何

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

は別の時に別途3つの辞書にロードする機能で、同じファイル内のすべての3つの辞書を格納しています。何かのように

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

さらに、最初の2つの辞書を読み込んで、3番目(大きい)のものを読み込むかどうかを任意に設定します。これは可能ですか、これについては全く違う方法で取り組まなければなりませんか?

+0

のロード中に適切な範囲を設定することにより、わずかなものをロードすることができ、私はそれを探しています。それを見つけません。 – Tekkzz

答えて

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で選択されたもの)に基づいて永続的な辞書を効果的に提供することをお勧めします。 dbは、あなたの大きな辞書のためのパフォーマンスの向上を提供する必要があります。

使用例:

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

としては、あなたが同じファイルに複数のオブジェクトをpickle化、および(同じ順序で)それらすべてをロードすることができ、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() 

ディクショナリを特定の順序で保存することができます。ディクショナリをロードする際に、選択されたものだけを選択するオプション。例えばのために

、あなたが順番に辞書を格納する場合:smallDict1smallDict2largeDict1
あなたがどこにはcPickleをダウンロードをお試した
(ここでfor i in range(2) ...

関連する問題