Python3标准库之dbm UNIX键-值数据库问题


Posted in Python onMarch 24, 2020

1. dbm UNIX键-值数据库

dbm是面向DBM数据库的一个前端,DBM数据库使用简单的字符串值作为键来访问包含字符串的记录。dbm使用whichdb()标识数据库,然后用适当的模块打开这些数据库。dbm还被用作shelve的一个后端,shelve使用pickle将对象存储在一个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模块为dbm格式的UNIX ndbm实现提供了一个接口,依赖于编译时这个模块如何配置。模块属性library指示编译扩展模块时configure能找到库名。

1.1.3 dbm.dumb

dbm.dumb模块是没有其他实现可用时DBM API的一个可移植的后备实现。使用dbm.dumb模块不需要依赖任何外部库,但它的速度比大多数其他实现都慢。

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 打开一个现有数据库

要打开一个现有数据库,可以使用flags '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 相关文章推荐
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Python中Random和Math模块学习笔记
May 18 Python
详解python中的线程
Feb 10 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
Python使用进程Process模块管理资源
Mar 05 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
快速创建python 虚拟环境
Nov 28 Python
分享3个非常实用的 Python 模块
Mar 03 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 #Python
python实现批量修改文件名
Mar 23 #Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 #Python
python实现遍历文件夹图片并重命名
Mar 23 #Python
Python3 mmap内存映射文件示例解析
Mar 23 #Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 #Python
python实现横向拼接图片
Mar 23 #Python
You might like
php获得当前的脚本网址
2007/12/10 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
实例讲解php实现多线程
2019/01/27 PHP
JavaScript 继承的实现
2009/07/09 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
JS画线(实例代码)
2013/11/20 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
python DataFrame 修改列的顺序实例
2018/04/10 Python
python学生管理系统
2019/01/30 Python
Python 实现微信防撤回功能
2019/04/29 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python实现学生管理系统开发
2020/07/24 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
保密承诺书范文
2014/03/27 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python
7个关于Python的经典基础案例
2021/11/07 Python
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js