web-dev-qa-db-ja.com

pickleとshelveの違いは何ですか?

オブジェクトのシリアル化について初めて学びました。モジュールのピクルスとシェルフの違いを読んで「グーグル」を試してみましたが、理解できるかどうかわかりません。どちらを使用するかPickleは、すべてのpythonオブジェクトをバイトストリームに変換し、ファイルに永続化できます。モジュールシェルブが必要なのはなぜですか?ピクルスは速くないのですか?

61
zubinmehta

pickleは、いくつかのオブジェクトをファイル内の単一のバイトストリームとしてシリアル化するためのものです。

shelvepickleの上に構築され、オブジェクトがピクルされるが、キー(一部の文字列)に関連付けられるシリアル化ディクショナリを実装します。キー。これは、多くのオブジェクトをシリアル化する場合に便利です。

次に、2つの間の使用例を示します。 (Python 2.7およびPython 3.x)の最新バージョンで動作するはずです。

pickleの例

import pickle

integers = [1, 2, 3, 4, 5]

with open('pickle-example.p', 'wb') as pfile:
    pickle.dump(integers, pfile)

これにより、integersリストがpickle-example.pというバイナリファイルにダンプされます。

ピクルスされたファイルを読み戻してください。

import pickle

with open('pickle-example.p', 'rb') as pfile:
    integers = pickle.load(pfile)
    print integers

上記は[1, 2, 3, 4, 5]を出力するはずです。

shelveの例

import shelve

integers = [1, 2, 3, 4, 5]

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
with shelve.open('shelf-example', 'c') as shelf:
    shelf['ints'] = integers

辞書のようなアクセスを介してシェルフにオブジェクトを追加する方法に注目してください。

次のようなコードでオブジェクトを読み戻します。

import shelve

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
with shelve.open('shelf-example', 'r') as shelf:
    for key in shelf.keys():
        print(repr(key), repr(shelf[key])))

出力は'ints', [1, 2, 3, 4, 5]になります。

82
wkl