为什么python中的shelve模块有时会创建具有不同扩展名的文件?

Ali*_*_IT 13 python unix shelve pickle

我正在运行一个使用该shelve模块的Python程序pickle.运行此程序后,有时我得到一个输出文件,a.data但在其他时候我得到三个输出文件a.data.bak,a.data.dira.data.dat.

这是为什么?

Mar*_*ers 29

这里有一些间接的东西.仔细跟我来.

shelve模块在anydbm模块顶部实现.此模块充当4个不同特定DBM实现的外观,它将按以下顺序选择创建新数据库时可用的第一个模块:

  1. dbhash(已弃用但仍是anydbm首选).这是bsddb模块的代理,.open()真的bsddb.hashopen()
  2. gdbm,用于GNU DBM库的Python模块,提供比dbm模块在与同一个lbrary一起使用时提供的功能更多的功能.
  3. dbm,使用ndbmBSD DB和GNU DBM库的代理模块(在编译Python时选择).
  4. dumbdbm,一个纯python实现.

正是这一系列选择使shelve文件看起来在不同平台上增加了额外的扩展.

dumbdbm模块是增加了一个.bak,.dat.dir扩展:

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

.dir文件将移动到.bak新索引dicts提交给数据结构的更改.

这意味着您的平台上没有其他三个选项anydbm.

其他格式可能会为您提供其他扩展.该dbm模块可以使用.dir,.pag或者.db,取决于该模块使用的库.

  • 创建两个带有`.dir`和`.dat`扩展名的空文件(如果它们尚不存在),之后`anydbm`将假定已存在一个`dumbdbm`数据库并使用`dumbdbm`模块. (3认同)
  • @avloss:为什么它不是 Pythonic?您将获得一个 API,该 API 可为您提供跨各种平台的相同类型的存储。结果文件的扩展名是一个实现细节。`objects.json` 不会像 `shelve` 那样容易使用。 (2认同)