サーチ…


構文

  • pickle.dump(オブジェクト、ファイル、プロトコル)#オブジェクトを直列化する

  • pickle.load(file)#オブジェクトを直列化解除するには

  • pickle.dumps(object、protocol)#オブジェクトをバイトにシリアル化する

  • pickle.loads(buffer)#オブジェクトをバイトからデシリアライズする

パラメーター

パラメータ詳細
オブジェクト格納されるオブジェクト
ファイルオブジェクトを含むオープンファイル
プロトコルオブジェクトを酸洗するためのプロトコル(オプションのパラメータ)
バッファ直列化されたオブジェクトを含むbytesオブジェクト

備考

Pickleableタイプ

以下のオブジェクトはpicklableです。

  • NoneTrueFalse
  • 数字(すべての種類の)
  • 文字列(すべての型の)
  • 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)

ピクルオブジェクトとバイトオブジェクトの使用

にシリアライズして使用して、バイトのオブジェクトのうち、デシリアライズすることも可能であるdumpsloadsに同等な機能を、 dumpload

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__ 、それが呼び出された場合に初期化されているだろうし。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow