详解Python中数据库管理模块shelve和dbm的应用

 更新时间:2023年10月27日 11:01:49   作者:Python 集中营  
作为常用的 python 自带数据库管理模块,shelve 和 dbm 都是非常方便的对象持久化存储和检索工具,本文将从用法、优势以及不同点等方面进行介绍,希望对大家有所帮助

作为常用的 python 自带数据库管理模块,shelve 和 dbm 都是非常方便的对象持久化存储和检索工具,并且这两个模块在使用上具有许多不同的特点。

本文将从 shelve 和 dbm 的介绍、用法、优势以及不同点等方面进行详细阐述和比较,希望能够帮助读者更好地理解和使用这两个数据库管理模块。

shelve 和 dbm 的介绍

shelve 和 dbm 都是 python 自带的数据库管理模块,可以用于持久化存储和检索 python 中的对象。

虽然这两个模块的本质都是建立 key-value 对应关系的数据库,但 shelve 模块更像是 python 中的持久化字典。

支持存储 python 中的几乎所有对象(如整型、字符串、字典、列表等),并且具有一定的数据压缩功能。

而 dbm 则仅支持字符串类型的键和值,并且它们会以二进制文件的方式存储在硬盘上。

shelve 需要使用 pickle 模块对 python 对象进行序列化和反序列化,而 dbm 则直接使用字节序列进行存储。

因此,如果需要实现 python 对象的持久化存储和检索,建议使用 shelve;否则,如果采用 dbm 更为合适。

不仅如此,shelve 和 dbm 在使用上还存在许多区别,例如 shelve 具有锁支持。

而 dbm 不支持锁操作,这意味着在一些数据安全性较高的场景下,shelve 更为适合。

接下来,我们将重点介绍 shelve 和 dbm 的用法、优势以及不同点等方面。

shelve 的用法

使用 shelve 模块建立和打开数据库非常简单,我们只需要执行如下代码:

import shelve
db = shelve.open('mydata.db')

这里,我们建立了一个名字为 mydata.db 的数据库文件,并使用 shelve 模块中的 open() 方法建立了一个 shelve 对象 db。

此时,我们可以使用 python 字典的方式来存储和读取对象:

import shelve
db = shelve.open('mydata.db')
db['key1'] = 'value1'
db['key2'] = 2
db['key3'] = {'name': 'Jack', 'age': 25}
print(db['key1']) # 输出 value1
print(db['key2']) # 输出 2
print(db['key3']) # 输出 {'name': 'Jack', 'age': 25}

可以看到,我们成功地将不同类型的 python 对象存储到了 shelve 数据库中,并且通过相应的键名完成了对其的读取操作。

需要注意的是,在使用 shelve 存储自定义对象时,通过 setstate__() 和 __getstate() 方法来实现对象的序列化和反序列化。

shelve 对象也可以使用 python 的 with 语句进行上下文管理:

import shelve

with shelve.open('mydata.db') as db:
    db['key4'] = {'name': 'Tom', 'age': 22}

print(db['key4']) # 输出 KeyError: 'key4'

使用 with 语句可以确保在代码块结束时,shelve 对象会被关闭,并将其所包含的对象保存到硬盘上。

此时,需要注意的是,由于已经关闭了 shelve 对象,无法再直接使用 db 对象访问键值 key4。

最后,我们需要手动关闭 shelve 数据库:

import shelve

db = shelve.open('mydata.db')
# 操作数据库
db.close()

dbm 的用法

与 shelve 类似,使用 dbm 模块建立和打开数据库也非常简单:

import dbm
db = dbm.open('mydata.db', 'c')

这里,我们建立了一个名字为 mydata.db 的数据库文件,并使用 dbm 的 open() 方法建立了一个 dbm 对象 db。

需要注意的是,与 shelve 不同的是,dbm 只支持字符串类型的键和值,并且需要用字节串的形式作为键和值。

我们可以使用字节串来存储字符串:

import dbm

db = dbm.open('mydata.db', 'c')
db[b'key1'] = b'value1'
db[b'key2'] = b'value2'

print(db[b'key1']) # 输出 value1
print(db[b'key2']) # 输出 value2

需要注意的是,我们使用了字节串作为键和值,以便在存储和读取时使用。

如果要将 Unicode 字符串存储到 dbm 中,需要使用 encode() 方法将其编码为字节串,例如:

import dbm

db = dbm.open('mydata.db', 'c')
db[b'key3'] = '这是一个字符串'.encode('utf-8')

print(db[b'key3'].decode('utf-8')) # 输出 这是一个字符串

与 shelve 一样,dbm 对象也可以使用 python 的 with 语句进行上下文管理:

import dbm

with dbm.open('mydata.db', 'c') as db:
    db[b'key4'] = b'value4'

print(db[b'key4']) # 输出 KeyError: b'key4'

需要注意的是,在使用 with 语句时,db 对象也会在离开代码块时自动关闭。

最后,我们需要手动关闭 dbm 数据库:

import dbm

db = dbm.open('mydata.db', 'c')
# 操作数据库
db.close()

shelve 和 dbm 的优势

shelve 和 dbm 模块的优势在于它们非常方便,无需安装任何第三方库即可使用。

它们的 API 与 python 内置的类型非常相似,因此使用起来非常简单。

此外,它们对于小型数据存储和检索非常高效,并且具有跨平台的优势。

尽管这些特点不一定具有普适性,但在许多程序中都是优秀且合理的选择。

此外,shelve 模块具有数据压缩的功能,可以在一定程度上提高存储效率。

这是由于 shelve 会将 python 对象转换为字符串,并压缩这些字符串,从而减小数据文件的大小。

因此,如果需要长期存储比较多的数据,使用 shelve 可以使得磁盘占用量更小,并且可以加速数据存储和检索的速度。

shelve 和 dbm 的不同点

shelve 和 dbm 在使用上具有许多不同点。下面我们将重点讨论它们的几种不同之处。

1. 数据类型不同

最引人注目的是,shelve 和 dbm 支持的数据类型不同。

shelve 可以存储任意的 python 对象,包括列表、字典、元组、自定义对象等,而 dbm 仅支持字节串类型的键和值。

具体来说,对于数据类型的限制,shelve 要比 dbm 更小。

这取决于具体应用需求,但是如果需要存储 python 对象,则可以使用 shelve,否则可以使用 dbm。

2. 支持不同的锁

shelve 具有锁支持,这意味着它可以被多个进程或线程同时访问,可以有效避免并发冲突的情况。

相比之下,dbm 不支持锁操作,这意味着在访问 dbm 数据库时需要自己实现自己的锁逻辑,以确保并发访问的正确性。

3. 磁盘空间占用不同

尽管 shelve 和 dbm 都是将数据存储在硬盘上,但是占用的磁盘空间大小却有所不同。

通常情况下,shelve 会压缩数据并存储它们,因此在许多情况下,shelve 会占用更少的磁盘空间。

而 dbm 不需要进行压缩操作,因此当存储的数据量较小时,dbm 相对于 shelve 更为节省磁盘空间。

总结

在本文中,我们详细介绍了 shelve 和 dbm 两个 python 自带的数据库管理模块,包括它们的介绍、用法、优势以及不同点等。

虽然 shelve 和 dbm 的共同点是都能实现简单的持久化存储和检索功能。

但是这两个模块在存储和检索的数据类型、支持锁的程度以及磁盘空间占用等方面存在许多不同点。

在选择具体的模块时,需要结合实际情况来进行选择。

到此这篇关于详解Python中数据库管理模块shelve和dbm的应用的文章就介绍到这了,更多相关Python shelve dbm内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python新年炫酷烟花秀代码

    Python新年炫酷烟花秀代码

    大家好,本篇文章主要讲的是Python新年炫酷烟花秀代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • python学习--使用QQ邮箱发送邮件代码实例

    python学习--使用QQ邮箱发送邮件代码实例

    这篇文章主要介绍了python使用QQ邮箱发送邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python中最快的循环姿势实例详解

    Python中最快的循环姿势实例详解

    python给我们提供了多个循环方法,比如while循环、for循环等,下面这篇文章主要给大家介绍了关于Python中最快的循环姿势,需要的朋友可以参考下
    2021-11-11
  • Python学习笔记之解析json的方法分析

    Python学习笔记之解析json的方法分析

    这篇文章主要介绍了Python解析json的方法,结合实例形式分析了常见的Python解析与转换json格式数据相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Python3.0中普通方法、类方法和静态方法的比较

    Python3.0中普通方法、类方法和静态方法的比较

    本文主要讲解了Python3中普通方法、类方法和静态方法的区别与比较,费了作者可大的劲整理了,希望对大家有用
    2019-05-05
  • Python一键实现统计本地文件或压缩包的代码行数

    Python一键实现统计本地文件或压缩包的代码行数

    本文主要介绍了一个Python脚本,用于一键统计本地文件夹或压缩包的代码行数,包括代码行数、空白行数、注释行数、总行数等,文中的示例代码讲解详细,希望对大家有所帮助
    2026-05-05
  • 关于Python字符串显示u...的解决方式

    关于Python字符串显示u...的解决方式

    这篇文章主要介绍了关于Python字符串显示u...的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python 异步之在 Asyncio中如何运行阻塞任务详解

    Python 异步之在 Asyncio中如何运行阻塞任务详解

    这篇文章主要为大家介绍了Python 异步之在 Asyncio 中运行阻塞任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 如何使用python的pillow库生成图像验证码

    如何使用python的pillow库生成图像验证码

    Pillow库是一个强大的Python图像处理库,用于生成图像验证码,通过初始化图像大小、验证码字符长度和字体大小,生成随机字符串、颜色、线和点,最终生成验证码图像
    2025-01-01
  • Python Numpy库常见用法入门教程

    Python Numpy库常见用法入门教程

    这篇文章主要介绍了Python Numpy库常见用法,结合实例形式详细Fenix了Python numpy库基本功能、原理以及数组常见操作技巧,需要的朋友可以参考下
    2020-01-01

最新评论