1. ホーム
  2. python

[解決済み] pickleとshelveはどう違うのですか?

2023-07-03 06:56:55

質問

初めてオブジェクトのシリアライズについて勉強しています。pickleとshelveというモジュールの違いを読んだり「ググったり」してみましたが、よくわかりません。いつ、どちらを使えばいいのでしょうか? PickleはすべてのPythonオブジェクトをバイトのストリームに変換し、それをファイルに保存することができます。では、なぜshelveというモジュールが必要なのでしょうか?pickleの方が速いのでは?

どのように解決するのですか?

pickle は、あるオブジェクト(またはオブジェクト)を1つのバイトストリームとしてファイルにシリアライズするためのものです。

shelve の上に構築されます。 pickle の上に構築され、オブジェクトがピクルス化されるシリアライズ辞書を実装していますが、キー(何らかの文字列)と関連付けられているので、棚上げされたデータファイルをロードして、キーを介してピクルス化されたオブジェクトにアクセスすることができます。これは、多くのオブジェクトをシリアライズする場合、より便利です。

この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 .

では、pickleしたファイルを読み返してみてください。

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] .