一、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 的用法、优势以及不同点等方面。

1.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()
 

2.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 更为节省磁盘空间。

Python数据存储之shelve和dbm的更多相关文章

  1. python数据存储--JSON

    HTML正文存储为两种格式:JSON和CSV. 存储为JSON: 首先利用Requests访问http://seputu.com获取HTML文档: #!coding:utf-8 import requ ...

  2. python数据存储技巧

    1.文本存储 比如我们现在有10篇文章,每篇文章由三部分组成,题目,作者,内容(title,author,content),然后要求这三个部分明确展示出来,并且每篇文章之间用=====分割. 大致思路 ...

  3. Python数据存储:pickle模块的使用讲解

    在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间.Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象 ...

  4. python数据存储-- CSV

    CSV,其文件以纯文本形式存储表格数据(数字和文本),CSV记录简由某种换行符分隔字段间分隔又其他字符,常见逗号或者制表符, 例如: #coding:utf-8 import csv headers ...

  5. [转]pickle python数据存储

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  6. Python数据存储 — MySQL数据库操作

    本地安装MySQL 调试环境python3.6,调试python操作mysql数据库,首先要在本地或服务器安装mysql数据库. 安装参考:https://mp.csdn.net/postedit/8 ...

  7. Python - 数据存储与数据库简介

  8. python轻量级数据存储

    python为开发者提供了一个轻量级的数据存储方式shelve,对于一些轻量数据,使用shelve是个比较不错的方式.对于shelve,可以看成是一个字典,它将数据以文件的形式存在本地.下面介绍具体用 ...

  9. python数据的存储和持久化操作

    Python的数据持久化操作主要是六类:普通文件.DBM文件.Pickled对象存储.shelve对象存储.对象数据库存储.关系数据库存储. 普通文件不解释了,DBM就是把字符串的键值对存储在文件里: ...

  10. python 数据序列化(json、pickle、shelve)

    本来要查一下json系列化自定义对象的一个问题,然后发现这篇博客(https://www.cnblogs.com/yyds/p/6563608.html)很全面,感谢作者,关于python序列化的知识 ...

随机推荐

  1. 携手华为云WeLink,合合信息旗下名片全能王推动人脉管理数智化升级

    名片是商务场景中信息传递的重要载体.在无纸化办公日益兴盛的当下,数字名片逐渐被广大职场人士接受,成为商务交流的新方式.近期,合合信息旗下名片全能王与华为云WeLink联合研发,升级数字名片" ...

  2. 浅谈 C# 中的顶级语句

    前言 在C# 9版本中引入了一项新特性:顶级语句,这一特性允许在不显式定义 Main 方法的情况下直接编写代码. 传统的写法 namespace TestStatements{    internal ...

  3. 低代码 + BI 数字化转型如何助力制造业供应链协同?

    引言 在当今快速变化的商业环境中,制造业面临着前所未有的挑战和机遇.全球化竞争.消费者需求的快速变化.技术创新的加速以及不断增加的成本压力,都要求制造企业不断提高其供应链的效率和灵活性.供应链协同作为 ...

  4. JavaScript – Promise

    前言 我学 Promise 的时候, 那时还没有 es6. 曾经还自己实现过. 但时隔多年, 现在 es6 的 promise 已经很完善了. 这篇作为一个简单的复习. (毕竟我已经 1 年多没有写 ...

  5. Azure Computer Vision 之 Smart Crop 智能裁剪图片

    前言 一个网站通常有许多地方会用到同一张图,但是比例又不一样. 一般的做法就是用 CSS 的 cover 和 contain 来处理. 由于 cover 只会保留中间信息, 所以很多时候需要人工裁剪. ...

  6. pytorch中LSTM各参数理解

    nn.LSTM(input_dim,hidden_dim,nums_layer,batch_first) 各参数理解: input_dim:输入的张量维度,表示自变量特征数 hidden_dim:输出 ...

  7. vsphere8.0 VCenter部署

    一.vCenter Server 介绍 vCenter Server是VMware提供的一种集中管理平台,用于管理和监控虚拟化环境中的虚拟机.主机.存储和网络等资源.它提供了一套功能强大的工具和界面, ...

  8. 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果

    最近更新一个Blazor server的项目,顺带把用到的Ant-Design-Blazor 升级到了最新的 0.14.4,结果发现之前在 0.8.4 版本中 Tree 组件的搜索显示效果变了,从仅显 ...

  9. MMU和SMMU IOMMU使用场景和区别,SMMU技术与cache

    1.各种MMU MMU是memory manage unit 内存管理单元: SMMU是system memory manage unit 系统内存管理单元: IOMMU和SMMU的功能基本相同,只是 ...

  10. 2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

    路漫漫其修远兮,吾将上下而求索. 2023年5月的 墨天轮中国数据库流行度排行 火热出炉,本月共有262个数据库参与排名.本月排行榜前十变动较大,可以用一句话概括为:openGauss 立足创新夺探花 ...