shelve 是 Python 标准库中提供的简单持久化存储模块,它允许将 Python 的任意可序列化对象(如字典、列表、自定义类等)以键值对的形式存储到一个类似字典的数据库文件中。
常见应用场景:
(1)将程序的中间结果或配置信息保存到磁盘。
(2)缓存大型对象,避免每次重新计算。
(3)简单替代 / 的数据存储方式(尤其适合非文本对象)。
(4)用于构建个人工具、脚本的小型数据持久化需求。
◆ ◆ ◆
核心概念
1、shelve.open() 返回一个类字典对象(Shelf 实例),支持读写操作。
2、键必须是字符串(str 类型),值可以是任意可 pickle 的对象。
3、本质上是一个“键值型数据库”,所有数据都保存在一个或多个 .db 文件中。
4、支持通过 with 语句自动关闭资源。
5、若对象内部状态修改后,需设置 writeback=True 或手动重新赋值,才能保存变更。
◆ ◆ ◆
应用举例
例 1: 基本读写操作
import shelve
# 打开一个 shelf 数据库
with shelve.open("mydata") as db:
db["name"] = "mediaTEA"
db["scores"] = [95, 88, 76]
# 再次读取
with shelve.open("mydata") as db:
print(db["name"]) # 输出: mediaTEA
print(db["scores"]) # 输出: [95, 88, 76]例 2:修改对象时注意 writeback 参数
import shelve
with shelve.open("cache", writeback=True) as db:
db["user"] = {"name": "Tom", "age": 20}
db["user"]["age"] = 21 # 自动更新(writeback=True)
# 如果不加 writeback=True,这样的内部修改将不会保存例 3:遍历 shelf 中的所有键
import shelve
with shelve.open("mydata") as db:
for key in db:
print(f"{key} => {db[key]}")例 4:删除数据
import shelve
with shelve.open("mydata") as db:
del db["name"] # 删除指定键例 5:检测键是否存在
import shelve
with shelve.open("mydata") as db:
if "scores" in db:
print("有成绩记录")◆ ◆ ◆
常用函数速览
shelve.open(filename, flag='c', protocol=None, writeback=False)
打开或创建一个 shelf 数据库文件,并返回一个类似字典的对象。
参数:
filename:数据库文件名(不需扩展名)
flag:文件打开模式:
'r':只读(文件必须存在)
'w':读写(文件必须存在)
'c':默认,读写,若文件不存在则创建
'n':新建空数据库,覆盖原文件
protocol:用于序列化的 pickle 协议版本
writeback:是否缓存写回(修改嵌套对象时使用)
返回:一个 shelf 对象,可像字典一样使用
shelf[key] = value
向 shelf 中写入键值对。键必须是字符串,值为任意可 pickle 的对象。
value = shelf[key]
读取指定键的值。若键不存在将抛出 KeyError。
del shelf[key]
从 shelf 中删除指定键。
key in shelf
检查某个键是否存在。
list(shelf.keys()) / list(shelf.values()) / list(shelf.items())
分别返回所有键、值、键值对。
.sync()
强制将缓存写入磁盘。适用于 writeback=True 模式,确保数据保存。
.close()
关闭 shelf 对象。使用 with 语句可自动关闭。
◆ ◆ ◆
补充说明
1、shelve 创建的数据库会生成多个文件(如 .db, .dat, .bak 等),文件名依操作系统和底层库而异。
2、不支持并发写入操作,多个程序同时写入可能导致数据损坏。
3、适用于轻量级使用,数据量大时建议考虑 SQLite、TinyDB 等专用数据库。
4、修改嵌套对象(如字典、列表)时需特别注意 writeback 参数或手动回写。
5、键名必须为字符串类型,值可为任意可序列化对象。
“点赞有美意,赞赏是鼓励”
热门跟贴