Python Language
ピクルデータのシリアライゼーション
サーチ…
構文
pickle.dump(オブジェクト、ファイル、プロトコル)#オブジェクトを直列化する
pickle.load(file)#オブジェクトを直列化解除するには
pickle.dumps(object、protocol)#オブジェクトをバイトにシリアル化する
pickle.loads(buffer)#オブジェクトをバイトからデシリアライズする
パラメーター
パラメータ | 詳細 |
---|---|
オブジェクト | 格納されるオブジェクト |
ファイル | オブジェクトを含むオープンファイル |
プロトコル | オブジェクトを酸洗するためのプロトコル(オプションのパラメータ) |
バッファ | 直列化されたオブジェクトを含むbytesオブジェクト |
備考
Pickleableタイプ
以下のオブジェクトはpicklableです。
-
None
、True
、False
- 数字(すべての種類の)
- 文字列(すべての型の)
-
tuple
s、list
s、set
s、およびpickleableオブジェクトのみを含むdict
- モジュールのトップレベルで定義された関数
- 組み込み関数
- モジュールのトップレベルで定義されているクラス
-
__dict__
または__getstate__()
呼び出しの結果であるそのようなクラスのインスタンスはpicklableです(詳細は、公式ドキュメントを参照してください)。
-
公式のPythonのドキュメントに基づいています 。
pickle
とセキュリティ
ピクルモジュールは安全ではありません 。インターネットなどの信頼できない当事者からシリアル化されたデータを受け取ったときには使用しないでください。
Pickleを使用してオブジェクトを直列化および逆シリアル化する
pickle
モジュールは、任意のPythonオブジェクトを一連のバイトに変換するアルゴリズムを実装します。このプロセスは、オブジェクトのシリアライズとも呼ばれます。その後、オブジェクトを表すバイトストリームを送信または格納し、後で再構成して同じ特性を持つ新しいオブジェクトを作成することができます。
最も単純なコードのために、 dump()
とload()
関数を使用します。
オブジェクトを直列化するには
import pickle
# An arbitrary collection of objects supported by pickle.
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('data.pickle', 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
オブジェクトを逆シリアル化するには
import pickle
with open('data.pickle', 'rb') as f:
# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)
ピクルオブジェクトとバイトオブジェクトの使用
にシリアライズして使用して、バイトのオブジェクトのうち、デシリアライズすることも可能であるdumps
とloads
に同等な機能を、 dump
とload
。
serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes
deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data
ピクルされたデータをカスタマイズする
一部のデータは、ピクルできません。その他のデータは、他の理由で漬けてはいけません。
pickleされるものは、 __getstate__
メソッドで定義できます。このメソッドは、picklableであるものを返す必要があります。
oposite側では、 __setstate__
: __getstate__
作成したものを受け取り、オブジェクトを初期化する必要があります。
class A(object):
def __init__(self, important_data):
self.important_data = important_data
# Add data which cannot be pickled:
self.func = lambda: 7
# Add data which should never be pickled, because it expires quickly:
self.is_up_to_date = False
def __getstate__(self):
return [self.important_data] # only this is needed
def __setstate__(self, state):
self.important_data = state[0]
self.func = lambda: 7 # just some hard-coded unpicklable function
self.is_up_to_date = False # even if it was before pickling
これを行うことができます:
>>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1) # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s) # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7
ここでの実装は、 [self.important_data]
1つの値を持つリストを[self.important_data]
。これはほんの一例に__getstate__
ず、 __setstate__
がどのようにしてoppoisiteを行うかを知っている限り、 __setstate__
はpicklableなものを__getstate__
ことができました。良い選択肢はすべての値の辞書です: {'important_data': self.important_data}
。
コンストラクタは呼び出されません!前の例では、インスタンスのことに注意してくださいa2
で作成されたpickle.loads
これまで呼び出すことなくA.__init__
ので、 A.__setstate__
すべて初期化しなければならなかった__init__
、それが呼び出された場合に初期化されているだろうし。