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、键名必须为字符串类型,值可为任意可序列化对象。

点赞有美意,赞赏是鼓励