Python3标准库dbm模块详解:UNIX键值数据库的创建、打开与错误处理

Jasper
Jasper
发布时间:2026-10-13 | 5人浏览过
原创

本文详细介绍Python3标准库中dbm模块的使用方法。涵盖dbm.gnu、ndbm和dumb三种数据库类型的特性与选择策略,演示如何通过open()函数以不同标志创建或打开数据库,并解析键值类型限制引发的TypeError错误处理机制,帮助开发者高效利用本地键值存储。

dbm UNIX键-值数据库概述

1. dbm UNIX键-值数据库

dbm模块作为DBM数据库的前端接口,允许使用简单的字符串键来访问包含字符串值的记录。该模块利用whichdb()函数自动识别数据库类型,并调用相应的底层模块进行打开操作。此外,dbm还作为shelve模块的后端存储,shelve借助pickle机制将Python对象序列化后存入DBM数据库中。

数据库类型与实现选择

1.1 数据库类型

Python提供了多种模块来访问DBM数据库。具体默认选择的实现取决于当前系统可用的库以及编译Python时配置的选项。由于特定实现拥有独立的接口,这使得Python程序能够与使用其他语言编写且不支持自动格式切换的程序交换数据,同时也能生成适用于多个平台的可移植数据文件。

1.1.1 dbm.gnu

dbm.gnu模块是GNU项目dbm库版本的一个接口。其工作方式与其他DBM实现类似,但open()函数支持的标志位有所不同。

除了标准的'r'、'w'、'c'和'n'标志外,dbm.gnu.open()还支持以下额外标志:

'f'标志用于以快速(fast)模式打开数据库。在此模式下,对数据库的写入操作不会立即同步到磁盘。

's'标志用于以同步(synchronized)模式打开数据库。启用此模式后,对数据库的修改会直接写入文件,而不是延迟到关闭数据库或执行显式同步操作时才写入。

'u'标志用于以不加锁(unlocked)状态打开数据库,适用于单线程或无需并发控制的场景。

1.1.2 dbm.ndbm

dbm.ndbm模块为UNIX系统的ndbm格式提供了接口,其具体行为依赖于编译时该模块的配置方式。通过检查模块属性library,可以得知编译扩展模块时configure脚本找到的库名。

1.1.3 dbm.dumb

当没有其他更高效的实现可用时,dbm.dumb模块作为DBM API的可移植后备实现。该模块不依赖任何外部库,但其运行速度通常比大多数其他实现要慢。

创建新数据库的方法

1.2 创建一个新数据库

创建新数据库时,系统会按顺序查找以下子模块的可用版本,以确定存储格式:

dbm.gnu

dbm.ndbm

dbm.dumb

open()函数接收flags参数以控制数据库文件的管理方式。若需要在必要时创建新数据库,可使用'c'标志;若使用'n'标志,则始终创建新数据库,并覆盖现有文件。


import dbm
with dbm.open('example.db', 'n') as db:
 db['key'] = 'value'
 db['today'] = 'Sunday'
 db['author'] = 'Doug'

在以下示例中,文件会被重新初始化。

whichdb()函数会报告所创建数据库的具体类型。


import dbm
print(dbm.whichdb('example.db'))

根据系统上安装的模块不同,示例程序的输出结果可能会有所差异。

打开现有数据库的操作

1.3 打开一个现有数据库

要打开现有数据库,可以使用'r'(只读)或'w'(读写)标志。系统会自动将现有数据库传递给whichdb()进行识别,只要文件可被识别,即可使用适当的模块打开该文件。


import dbm
with dbm.open('example.db', 'r') as db:
 print('keys():', db.keys())
 for k in db.keys():
  print('iterating:', k, db[k])
 print('db["author"] =', db['author'])

一旦数据库被打开,db即变为一个类字典对象。向数据库添加数据时,新建的键和值均会被转换为字节串,并以字节串形式返回。

错误处理与类型限制

1.4 错误情况

数据库的键必须是字符串类型。


import dbm
with dbm.open('example.db', 'w') as db:
 try:
  db[1] = 'one'
 except TypeError as err:
  print(err)

如果传入非字符串类型的键,将导致TypeError异常。

数据库的值必须是字符串或None。


import dbm
with dbm.open('example.db', 'w') as db:
 try:
  db['one'] = 1
 except TypeError as err:
  print(err)

如果值不是字符串类型,同样会产生TypeError异常。

总结

到此这篇关于Python3标准库之dbm UNIX键-值数据库的文章就介绍到这了,更多相关python 标准库dbm UNIX键值数据库内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表