web-dev-qa-db-ja.com

Python

最近、ピクルス形式で辞書(各キーがリストを参照する)を配置する必要がある割り当てを取得しました。唯一の問題は、漬物の形がわからないことです。誰かが私にこの概念を学ぶのに役立つ良いリソースの正しい方向を教えてくれますか?ありがとう!

54
Spencer

Pickleモジュールは、Pythonオブジェクト構造をシリアライズおよびデシリアライズするための基本的かつ強力なアルゴリズムを実装しています。

ピクルス-は、Pythonオブジェクト階層がバイトストリームに変換されるプロセスであり、Picklingの解除-は逆の操作で、バイトストリームはオブジェクト階層に変換されます。

酸洗(および酸洗)は、代わりにserializationmarshalling、または平坦化

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()

漬物ファイルから読み取るには-

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()

ソース- https://docs.python.org/2/library/pickle.html

86

他の人がPython pickleモジュールに関する素晴らしいリソースであるドキュメントを指摘している間、あなたはまたチェックアウトすることができます 第13章:Python =オブジェクト ofDive Into Python 3by Mark Pilgrim。

25
Matthew Rankin

Picklingは、関連する状態をpythonオブジェクトから文字列に変換するために使用できるミニ言語で、この文字列はオブジェクトを一意に表します。その後、(un)picklingを使用して変換できます文字列を作成した保存状態からオブジェクトを「再構築」することにより、文字列をライブオブジェクトに追加します。

>>> import pickle
>>> 
>>> class Foo(object):
...   y = 1
...   def __init__(self, x):
...     self.x = x
...     return
...   def bar(self, y):
...     return self.x + y
...   def baz(self, y):
...     Foo.y = y  
...     return self.bar(y)
... 
>>> f = Foo(2)
>>> f.baz(3)
5
>>> f.y
3
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(c__main__\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nI2\nsb."

ここで確認できるのは、pickleはクラスのソースコードを保存せず、クラス定義への参照を保存していることです。基本的には、選択した文字列をほとんど読み取ることができます...(おおまかに翻訳すると)「引数が__main__.Fooで定義されたクラスであるcopy_regの再構築プログラムを呼び出してから、他の処理を行います」。他のものは、インスタンスの保存状態です。さらに深く見ると、「文字列x」が「整数2」に設定されていることを抽出できます(おおよそ:S'x'\np6\nI2)。これは、実際には辞書エントリのピクルス文字列のクリップ部分です... dictf.__dict__であり、{'x': 2}です。 pickleのソースコードを見ると、各タイプのオブジェクトと操作のpythonからピクルドバイトコードへの変換)が非常に明確に示されています。

また、酸洗言語にはさまざまなバリエーションがあることに注意してください。デフォルトはプロトコル0で、より人間が読みやすくなっています。以下に示すプロトコル2もあります(使用しているpythonのバージョンに応じて、1、3、および4)。

>>> pickle.dumps([1,2,3])
'(lp0\nI1\naI2\naI3\na.'
>>> 
>>> pickle.dumps([1,2,3], -1)
'\x80\x02]q\x00(K\x01K\x02K\x03e.'

繰り返しますが、それはまだピクルス言語の方言であり、プロトコル0の文字列は「リストを取得し、I1、I2、I3を含む」と表示されますが、プロトコル2は読みにくいですが、同じことを示しています最初のビット\x80\x02は、プロトコル2であることを示しています。リストであると言う]があり、そこにも整数1,2,3が表示されています。繰り返しますが、pickleのソースコードをチェックして、pickle言語の正確なマッピングを確認してください。

酸洗を文字列に戻すには、load/loadsを使用します。

>>> p = pickle.dumps([1,2,3])
>>> pickle.loads(p)
[1, 2, 3]
22
Mike McKerns

酸洗は、単にシリアル化です。ファイルに保存して後で取得できるフォームにデータを入れます。 pickleモジュールに関するドキュメントは次のとおりです。

http://docs.python.org/release/2.7/library/pickle.html

11
Tom Zych

Pythonのpicklingは、あなたの場合の辞書のように、Pythonオブジェクトをシリアライズおよびデシリアライズするために使用されます。 cPickleモジュールよりもはるかに高速であるため、通常はPickleモジュールを使用します。

import cPickle as pickle    

def serializeObject(pythonObj):
    return pickle.dumps(pythonObj, pickle.HIGHEST_PROTOCOL)

def deSerializeObject(pickledObj):
    return pickle.loads(pickledObj)
3
Raunak

http://docs.python.org/library/pickle.html#example

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()
3
John Riselvato

Pickleモジュールは、Pythonオブジェクト構造をシリアライズおよびデシリアライズするための基本的かつ強力なアルゴリズムを実装します。「Pickling」は、Pythonは、バイトストリームに変換され、「アンピックリング」は逆の操作であるため、バイトストリームはオブジェクト階層に変換されます。ただし、混乱を避けるために、ここで使用される用語は「ピクルスにする」と「アンピクルする」です。

Pickleモジュールには、cPickleモジュールと呼ばれる最適化されたいとこがあります。その名前が示すように、cPickleはCで記述されているため、pickleよりも最大1000倍高速です。ただし、cPickleではこれらはクラスではなく関数であるため、Pickler()およびUnpickler()クラスのサブクラス化はサポートしていません。ほとんどのアプリケーションはこの機能を必要とせず、cPickleの改善されたパフォーマンスの恩恵を受けることができます。それ以外は、2つのモジュールのインターフェースはほぼ同じです。共通のインターフェースはこのマニュアルで説明されており、必要に応じて違いが指摘されています。次の説明では、「pickle」という用語を使用して、pickleおよびcPickleモジュールをまとめて説明します。

2つのモジュールが生成するデータストリームは、交換可能であることが保証されています。

2
Naren