15

我正在运行一个 Python 程序,它shelve使用pickle. 运行这个程序后,有时我得到一个输出文件,a.data但有时我得到三个输出文件a.data.baka.data.dira.data.dat.

这是为什么?

4

1 回答 1

32

这里有相当多的间接性。仔细跟着我。

该模块是在模块shelve之上实现的。该模块充当 3 (*不同的特定 DBM 实现的外观,它将在创建新数据库时选择第一个可用的模块,顺序如下:dbm

  1. dbm.gnu, GNU DBM 库的 Python 模块;如果您需要它在基本dbm模块上提供的额外功能,您可以直接使用它(它允许您按存储顺序迭代键并“打包”数据库以释放已删除对象的空间)。
  2. dbm.ndbm,一个使用ndbmBSD DB 和 GNU DBM 库(在 Python 编译时选择)的代理模块。
  3. dbm.dumb,一个纯python实现。

正是这种选择范围使shelve文件看起来在不同平台上增加了额外的扩展名。

dbm.dumb模块是添加.bak,.dat.dir扩展的模块:

打开一个dumbdbm 数据库并返回一个dumbdbm 对象。filename 参数是数据库文件的基本名称(没有任何特定的扩展名)。创建dumbdbm 数据库时,会创建带有.dat.dir扩展名的文件。

当新的索引字典被提交以对数据结构进行更改时(当添加新键、删除键或调用or时),该.dir文件将被移至。.bak.sync().close()

这意味着其他三个选项anydbm在您的平台上不可用。

其他格式可能会给您其他扩展。该dbm模块可能使用或.dir,具体取决于该模块使用的库。.pag.db


(* Python 2 有四个dbm 模块,它将默认为不推荐使用的dbhash模块,而后者又构建在bsddb模块之上。这些都从 Python 3 中删除。

于 2013-04-26T07:45:02.960 回答