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