<学习笔记>从零开始自学Python-之-常用库篇(十三)内置小型数据库shelve

一、shelve简介:

shelve是Python当中数据储存的方案,类似key-value数据库,便于保存Python对象,shelve只有一个open()函数,用来打开指定的文件(字典),会返回一个对象shelf,shelf也是类似字典的对象。

二、.open()函数:

.open()函数的格式:shelve.open(file_name, flag='', writeback=True\False)

file_name:文件名

flag:打开数据存储文件的格式:

可选参数flag,默认为"c",如果数据文件不存在,就创建,允许读写;

(1)、flag='r' 只读模式打开存在数据的文件

(2)、flag='w'读写模式打开存在数据的文件

(3)、flag='c'读写模式打开存在数据的文件,如果不存在则创建

(4)、flag='n'总是创建一个新的、空数据的文件

writeback:一般情况下,我们通过shelve.open()一个对象后,只能进行一次赋值,但是可以通过设定writeback:True来实现,这里writeback的默认值为False。

三、创建数据:
python 复制代码
import shelve

sh = shelve.open('mydata')
sh['name']='张三'
sh['age']=25
sh.close()

这样运行之后,文件夹下就会生成3个文件:

.dat就是数据文件,.bak是备份文件, .dir是目录文件

四、读取数据:

(1)、以字典的形式获取数据

python 复制代码
import shelve
 
db = shelve.open('mydata')
print(db['name'])
print(db['age'])

运行如下:

python 复制代码
张三
25

(2)、用get的方式获取:

python 复制代码
import shelve
 
db = shelve.open('mydata')

print(db.get('name'))
print(db.get('age'))

运行如下:

python 复制代码
张三
25

五、存储复杂的对象

shelve储存的实际上是一个字典,它的键值必须是字符串,但是它的值可以是任意Python对象,这就给了我们广阔的使用空间

5.1 储存个复杂点的嵌套列表看看
python 复制代码
import shelve

db = shelve.open('mydata')


db['students'] = [{"一班":[{"name":"黄蓉","age":19,"性别":"女"},{"name":"郭靖","age":29,"性别":"男"},{"name":"欧阳锋","age":39,"性别":"男"}]},
                  {"二班":[{"name":"杨过","age":23,"性别":"男"},{"name":"小龙女","age":32,"性别":"女"},{"name":"郭芙","age":29,"性别":"女"}]}]


print('数据已储存!')
db.close()

然后我们读取数据,注意列表要用列表的办法访问,字典要用字典的办法访问

python 复制代码
import shelve
 
db = shelve.open('mydata')

print(db['students'][1])
print(db['students'][1]['二班'][2]['name'])

运行如下:

python 复制代码
{'二班': [{'name': '杨过', 'age': 23, '性别': '男'}, {'name': '小龙女', 'age': 32, '性别': '女'}, {'name': '郭芙', 'age': 29, '性别': '女'}]}
郭芙
5.2 储存个类看看:

比如我们现在新建一个篮球球员类Player,然后我们随机生成3个球员,储存到shelve里面

python 复制代码
import shelve
import random

class Player():
    def __init__(self):
        self.name = random.choice(["黄蓉","杨过","郭靖","小龙女","郭芙","欧阳锋","洪七公","黄药师"])
        self.age = random.choice([20,50])
        self.position = random.choice(['C','PF','SF','SG','PG'])
    def __str__(self) -> str:
        return "{},{},{}\n".format(self.name,self.age,self.position)

player_list=[]
for i in range(3):
    qiuyuan = Player()
    player_list.append(qiuyuan)


db['players'] = player_list



print('数据已储存!')
db.close()

然后我们读取数据看看,但是要注意,这里要把Player这个类引用一下,我这里图省事就重写了一遍,然后就可以按照类的引用方法去引用具体对象实例

python 复制代码
import shelve
import random

db = shelve.open('mydata')


class Player():
    def __init__(self):
        self.name = random.choice(["黄蓉","杨过","郭靖","小龙女","郭芙","欧阳锋","洪七公","黄药师"])
        self.age = random.choice([20,50])
        self.position = random.choice(['C','PF','SF','SG','PG'])
    def __str__(self) -> str:
        return "{},{},{}\n".format(self.name,self.age,self.position)
    
players=db['players']
for p in players:
    print(p.name)
    print(p)

运行如下:

python 复制代码
小龙女
小龙女,20,SG

洪七公
洪七公,20,C

杨过
杨过,50,C
相关推荐
zone77391 天前
001:简单 RAG 入门
后端·python·面试
F_Quant1 天前
🚀 Python打包踩坑指南:彻底解决 Nuitka --onefile 配置文件丢失与重启报错问题
python·操作系统
允许部分打工人先富起来1 天前
在node项目中执行python脚本
前端·python·node.js
IVEN_1 天前
Python OpenCV: RGB三色识别的最佳工程实践
python·opencv
haosend1 天前
AI时代,传统网络运维人员的转型指南
python·数据网络·网络自动化
曲幽1 天前
不止于JWT:用FastAPI的Depends实现细粒度权限控制
python·fastapi·web·jwt·rbac·permission·depends·abac
tingshuo29172 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
IVEN_2 天前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang2 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮2 天前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python