[解決済み] 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]
.
関連
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenvなどの違いは何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み] if 節の終了方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?