82

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

4

2 に答える 2

110

pickle一部のオブジェクト (またはオブジェクト) をファイル内の単一のバイトストリームとしてシリアル化するためのものです。

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

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

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]

于 2010-11-05T03:47:50.270 に答える
4

According to pickle documentation:

Serialization is a more primitive notion than persistence; although pickle reads and writes file objects, it does not handle the issue of naming persistent objects, nor the (even more complicated) issue of concurrent access to persistent objects. The pickle module can transform a complex object into a byte stream and it can transform the byte stream into an object with the same internal structure. Perhaps the most obvious thing to do with these byte streams is to write them onto a file, but it is also conceivable to send them across a network or store them in a database. The shelve module provides a simple interface to pickle and unpickle objects on DBM-style database files.

于 2020-01-27T21:24:59.720 に答える