2017-02-16 7 views
0

私は特定のオブジェクトをとりファイルとして保存するキャッシングスクリプトを作成しています。オブジェクトの初期パラメータはファイル名として使用されるはずです(異なる初期パラメータに対して異なるキャッシュが必要なため)。ピクルダンプには固有の表現はありませんか?

私は直列化がbijectionであると考えていたので、(パラメータ)辞書をシリアル化し、hashlib.sha224().hexdigest()を使用して16進数を作成し、最初のXX文字をファイル名として使用することでした。しかし、繰り返しpickle.dumpsを使用して辞書をシリアライズすることは、異なる直列化をもたらし...

私は辞書シリアライズしたい:

attr = {'I': 1, 
'LBar': 1, 
'N': 50, 
'ProdMatch': 1, 
'T': 10, 
'alpha': 0.5, 
'b': 0.1, 
'c': 0.1, 
'delta': 0.1, 
'deltaN': 0.02, 
'deltaT': 10.0, 
'logspace': False, 
'nT': 1, 
'period': 'quarterly', 
'rho': 0.03, 
'sigma': 0.5} 

ser = pickle.dumps(attr) 
print(pickle.loads(ser)) 

出力として私に入力辞書と次の文字列を与えます。

b'\x80\x03}q\x00(X\x01\x00\x00\x00cq\x01G?\xb9\x99\x99\x99\x99\x99\x9aX\x01\x00\x00\x00Nq\x02K2X\x01\x00\x00\x00Tq\x03K\nX\x05\x00\x00\x00deltaq\x04G?\xb9\x99\x99\x99\x99\x99\x9aX\x06\x00\x00\x00deltaNq\x05G?\x94z\xe1G\xae\x14{X\x06\x00\x00\x00deltaTq\[email protected]$\x00\x00\x00\x00\x00\x00X\x05\x00\x00\x00alphaq\x07G?\xe0\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00rhoq\x08G?\x9e\xb8Q\xeb\x85\x1e\xb8X\x04\x00\x00\x00LBarq\tK\x01X\x01\x00\x00\x00bq\nG?\xb9\x99\x99\x99\x99\x99\x9aX\x06\x00\x00\x00periodq\x0bX\t\x00\x00\x00quarterlyq\x0cX\x02\x00\x00\x00nTq\rK\x01X\x01\x00\x00\x00Iq\x0eK\x01X\t\x00\x00\x00ProdMatchq\x0fK\x01X\x05\x00\x00\x00sigmaq\x10G?\xe0\x00\x00\x00\x00\x00\x00X\x08\x00\x00\x00logspaceq\x11\x89u.' 

私はその後、私のPythonインタプリタを再起動し、同じスクリプトを実行します。

b'\x80\x03}q\x00(X\x05\x00\x00\x00deltaq\x01G?\xb9\x99\x99\x99\x99\x99\x9aX\x05\x00\x00\x00alphaq\x02G?\xe0\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00LBarq\x03K\x01X\x01\x00\x00\x00Iq\x04K\x01X\x02\x00\x00\x00nTq\x05K\x01X\x01\x00\x00\x00bq\x06G?\xb9\x99\x99\x99\x99\x99\x9aX\x01\x00\x00\x00Tq\x07K\nX\x03\x00\x00\x00rhoq\x08G?\x9e\xb8Q\xeb\x85\x1e\xb8X\x01\x00\x00\x00cq\tG?\xb9\x99\x99\x99\x99\x99\x9aX\t\x00\x00\x00ProdMatchq\nK\x01X\x06\x00\x00\x00periodq\x0bX\t\x00\x00\x00quarterlyq\x0cX\x06\x00\x00\x00deltaNq\rG?\x94z\xe1G\xae\x14{X\x06\x00\x00\x00deltaTq\[email protected]$\x00\x00\x00\x00\x00\x00X\x05\x00\x00\x00sigmaq\x0fG?\xe0\x00\x00\x00\x00\x00\x00X\x08\x00\x00\x00logspaceq\x10\x89X\x01\x00\x00\x00Nq\x11K2u.' 

これらは異なるシリアル化されています。 loads()は最初の辞書を再生成しますが、Pickleは壊れていませんが、別のハッシュで検索すると保存されたファイルが見つからないため、この動作はできません。私もdill.dumpsを試しましたが、同じ結果でした。

答えて

1

Python 3.6より前の辞書は、特定の繰り返し可能な順序を持っていません。実際、Python 3からPython 3.5までは、その順序がランダム化されています。

は、アイテムをソートしてみてください。

import pickle 
ser = pickle.dumps(sorted(attr.items())) 
print(dict(pickle.loads(ser))) 
+0

はあなたのためにこの仕事をしていますか? –

関連する問題