15

shelveの上でモジュールを使用する Python プログラムを実行していますpickle。このプログラムを実行した後、1 つの出力ファイルa.dataが として得られることもありますが、3 つの出力ファイルがa.data.baka.data.dirおよびとして得られることもありa.data.datます。

何故ですか?

4

1 に答える 1

32

ここにはかなりの間接性があります。注意深く私に従ってください。

モジュールは、モジュールshelveの上に実装されます。このモジュールは 3 (*異なる特定の DBM 実装のファサードとして機能し、新しいデータベースを作成するときに使用可能な最初のモジュールを次の順序で選択します。dbm

  1. dbm.gnu、GNU DBM ライブラリの Python モジュール。dbm基本モジュールに対して提供される追加機能が必要な場合は、直接使用します (格納された順序でキーを反復処理し、データベースを「パック」して、削除されたオブジェクトからスペースを解放できます)。
  2. dbm.ndbmndbm、 BSD DB および GNU DBM ライブラリのいずれかを使用するプロキシ モジュール( Python のコンパイル時に選択)。
  3. dbm.dumb、純粋な Python 実装です。

shelveファイルがさまざまなプラットフォームで余分な拡張子を成長させているように見えるのは、この選択の範囲です。

dbm.dumbモジュールは、.bak.datおよび.dir拡張機能を追加するものです。

dumpdbm データベースを開き、dumpdbm オブジェクトを返します。filename 引数は、データベース ファイルのベース名です (特定の拡張子なし)。dumpdbm データベースが作成されると、拡張子が.datおよびのファイルが作成されます。.dir

.dirファイルは、新しいインデックス dict がデータ構造に加えられた変更に対してコミットされるときに移動され.bakます (新しいキーを追加するとき、キーを削除するとき、または または を呼び出すとき.sync()) .close()

これは、他の3 つのオプションanydbmがプラットフォームで利用できないことを意味します。

他の形式では、他の拡張子が得られる場合があります。dbmモジュールは、そのモジュールに使用されたライブラリに応じて、 または を使用する場合があり.dirます.pag.db


(* Python 2 には4 つのdbm モジュールがあり、デフォルトで deprecated dbhashmoduleになり、これはbsddbmoduleの上に構築されました。これらは両方とも Python 3 から削除されました。

于 2013-04-26T07:45:02.960 に答える