pickleとcPickle-pythonオブジェクトのシーケンス化

3477 ワード

pickleとcPickle-pythonオブジェクトのシーケンス化
pickleモジュールは、ベースであるが強力なpythonオブジェクトのシーケンス化と逆シーケンス化の方法を導入した.(pickling and unpickling)
pickingはpythonオブジェクトをバイナリストリームの形式に変換するプロセスであり、unpicklingはこの逆プロセスである.
注意:pickleモジュールは安全ではありません.Hackerはpickleモジュールを利用して悪意のあるコード注入を行う可能性があります.pickingプロセスでは、stringが生成されるため、心配する必要はありません.しかし、unpicklingプロセスでは、unpickkeは信頼されていないstringが必ずしも安全ではありません.unpickleは予想できないオブジェクトを生成する可能性が高いからです.だからunpickleのstringの出所に注意してください.
pickleモジュールに近いモジュールの1つはcPickleであり、その名前がc言語で書かれているように、pickleモジュールの約1000倍の速度であるが、cPickleはpickler()とUnpickler()のサブクラスをサポートしない.cPickleモジュールには関数のみクラスが存在しないためである.cPickleモジュールとpickleモジュールは、あるデータストリーム(dumpを使用してファイルに格納されたデータ)について、cPickleモジュールのloadメソッドとpickleモジュールのloadメソッドを使用して読み取ることができる場合があります.
<span style="font-size:14px;">>>> import cPickle
>>> import pickle
>>> class Foo:
	name = 'wang'
>>> f = open('N:\\wang.txt','w')
>>> cPickle.dump(Foo,f)
>>> f.close()
>>> f = open('N:\\wang.txt','r')
>>> print pickle.load(f)
__main__.Foo
>>> f.close()
>>> f = open('N:\\wang.txt','r')
>>> print cPickle.load(f)
__main__.Foo
>>> f.close()</span>

Pythonにはシーケンス化をサポートするより原始的なモジュールがある-marshal、通常pickleモジュールの性能はいつもmarshalモジュールよりよく、marshalの存在は主にPythonをサポートするためである.pycファイル.
pycファイルについては詳しく説明しないが、ここではPythonの元のコードが実行前にバイトコードにコンパイルされ、コンパイルされた結果を1つ1つのPyCodeObjectに保存し、pycファイルはPyCodeObjectをメモリからmarshal形式でファイルに保存した結果であることを知るだけである.
データ・ストリームのフォーマット:
pickleが生成するデータストリームフォーマットはPython独自であり、外部標準で参照される場合に制限がないという利点があるが、Python以外のアプリケーションではpickleが生成したデータストリームを解析できない.
デフォルトでは、pickleで生成するデータストリームフォーマットは印刷可能なASCIIコードを使用しており、プログラマーにとって読みやすさがあり、格納txtファイルを開くだけで生成されたデータストリームを容易に理解することができ、上のコードのwang.txtの内容:
c__main__
Foo
p1
分かりやすいです.現在picklingには3つの異なるプロトコルがあります.
protocol 0:元のASCIIプロトコル、後方互換性
protocol 1:古いバイナリフォーマット、同様に後方互換性
protocol 2:Python2.3導入により、新しいクラス(new-style classes)に対してより効率的なpicklingが提供される
Example:
<span style="font-size:14px;">import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()</span>
<span style="font-size:14px;">import pprint, pickle

pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()</span>

pickleのデータ型:
None, True, and False
integers, long integers, floating point numbers, complex numbers
normal and Unicode strings
tuples, lists, sets, and dictionaries containing only picklable objects
functions defined at the top level of a module
built-in functions defined at the top level of a module
classes that are defined at the top level of a module
instances of such classes whose __dict__ or the result of calling __getstate__() is picklable (see section The pickle protocol for details).