你知道 Python 着实自带了小型数据库吗?

鼠扑  金牌会员 | 2024-8-31 03:59:25 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 576|帖子 576|积分 1728


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


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

而 Python 标准库提供了一个 dbm 模块,它实现了 DBM 文件系统的功能,来看一下它的用法。
  1. import dbm
  2. # 第一个参数是文件名
  3. # 第二个参数是模式,有以下几种
  4. #     r:只读,要求文件必须存在,默认就是这个模式
  5. #     w:可读可写,要求文件必须存在
  6. #     c:可读可写,文件不存在会创建,存在则追加
  7. #     n:可读可写,文件不存在会创建,存在则清空
  8. # 第三个参数是权限,用八进制数字表示,默认 0o666,即可读可写不可执行
  9. db = dbm.open("store", "c")
  10. # 打开文件就可以存储值了,key 和 value 必须是字符串或 bytes 对象
  11. db["name"] = "S せんせい"
  12. db["age"] = "18"
  13. db[b"corporation"] = "小摩".encode("utf-8")
  14. # 关闭文件,将内容写到磁盘上
  15. db.close()
复制代码
非常简朴,就像操作字典一样,并且 key 是唯一的,如果存在则替换。实行完后,当前目录会多出一个 store.db 文件。

我们打开它,然后读取刚才写入的键值对。
  1. import dbm
  2. db = dbm.open("store", "c")
  3. # 获取所有的 key,直接返回一个列表
  4. print(db.keys())
  5. """
  6. [b'corporation', b'name', b'age']
  7. """
  8. # 判断一个 key 是否存在,key 可以是字符串或 bytes 对象
  9. print("name" in db, "NAME" in db)
  10. """
  11. True False
  12. """
  13. # 获取一个 key 对应的 value,得到的是 bytes 对象
  14. print(db["name"].decode("utf-8"))
  15. print(db[b"corporation"].decode("utf-8"))
  16. """
  17. S せんせい
  18. 小摩
  19. """
  20. # key 如果不存在,会抛出 KeyError,我们可以使用 get 方法
  21. print(db.get("NAME", b"unknown"))
  22. """
  23. b'unknown'
  24. """
  25. # 当然也可以使用 setdefault 方法,key 不存在时,自动写进去
  26. print(db.setdefault("gender", b"female"))
  27. """
  28. b'female'
  29. """
  30. print(db["gender"])
  31. """
  32. b'female'
  33. """
复制代码
非常简朴,当你必要存储的数据量不适合放在内存中,但又没必要引入数据库,那么不妨试试使用 dbm 模块吧。
当然啦,dbm 固然很方便,但它只能持久化 bytes 对象,字符串也是转成 bytes 对象之后再存储的。所以除了 dbm 之外,还有一个标准库模块 shelve,它可以持久化恣意对象。
shelve

shelve 的使用方式和 dbm 几乎是同等的,区别就是 shelve 的序列化本领要更强,当然速度自然也就慢一些。
[code]import shelve

# 第二个参数表示模式,默认是 c
# 因此文件不存在会创建,存在则追加
sh = shelve.open("shelve")

sh["name"] = ["S 老师", "高老师", "电烤

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表