dbm文件系统

DBM(DataBase Manager)是一种文件系统,专门用于键值对的存储,最初是在Unix平台实现,现在其它平台也可以用。对于KV模型,DBM 提供了一个轻量级、高效的存储解决方案。
总的来说,DBM具有如下特点:

  • 简单快速:非常简单易用,读取和写入操作都很快,适合存储少量数据。
  • 键值对存储:数据是以键值对形式存储的,你可以像操作 Python 字典一样。
  • 文件存储:数据存在具体的文件中,可以轻松地备份和转移。
  • 不支持复杂查询:如果需要执行复杂查询或需要关系型数据库的功能,DBM可能不是一个好选择。

Python标准库提供了一个dbm模块,它实现了DBM文件系统的功能。
(1)写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import dbm

# 第一个参数是文件名
# 第二个参数是模式,有以下几种
# r:只读,要求文件必须存在,默认就是这个模式
# w:可读可写,要求文件必须存在
# c:可读可写,文件不存在会创建,存在则追加
# n:可读可写,文件不存在会创建,存在则清空
# 第三个参数是权限,用八进制数字表示,默认 0o666,即可读可写不可执行
db = dbm.open("store", "c")

# 打开文件就可以存储值了,key 和 value 必须是字符串或 bytes 对象
db["name"] = "小明"
db["age"] = "18"
db[b"corporation"] = "A公司".encode("utf-8")

# 关闭文件,将内容写到磁盘上
db.close()

(2)读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import dbm

db = dbm.open("store", "c")

# 获取所有的 key,直接返回一个列表
print(db.keys())
"""
[b'corporation', b'name', b'age']
"""
# 判断一个 key 是否存在,key 可以是字符串或 bytes 对象
print("name" in db, "NAME" in db)
"""
True False
"""
# 获取一个 key 对应的 value,得到的是 bytes 对象
print(db["name"].decode("utf-8"))
print(db[b"corporation"].decode("utf-8"))
"""
小明
A公司
"""
# key 如果不存在,会抛出 KeyError,我们可以使用 get 方法
print(db.get("NAME", b"unknown"))
"""
b'unknown'
"""
# 当然也可以使用 setdefault 方法,key 不存在时,自动写进去
print(db.setdefault("gender", b"female"))
"""
b'female'
"""
print(db["gender"])
"""
b'female'
"""