我正在运行一个 Python 程序,它shelve
使用pickle
. 运行这个程序后,有时我得到一个输出文件,a.data
但有时我得到三个输出文件a.data.bak
,a.data.dir
和a.data.dat
.
这是为什么?
这里有相当多的间接性。仔细跟着我。
该模块是在模块shelve
之上实现的。该模块充当 3 (*不同的特定 DBM 实现的外观,它将在创建新数据库时选择第一个可用的模块,顺序如下:dbm
dbm.gnu
, GNU DBM 库的 Python 模块;如果您需要它在基本dbm
模块上提供的额外功能,您可以直接使用它(它允许您按存储顺序迭代键并“打包”数据库以释放已删除对象的空间)。dbm.ndbm
,一个使用ndbm
BSD DB 和 GNU DBM 库(在 Python 编译时选择)的代理模块。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 中删除。