<学习笔记>从零开始自学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
相关推荐
Evan_Lai7 分钟前
(一)独热编码、标签编码、目标编码、序数编码详解
python·机器学习
用户7624117567058 分钟前
第二章 Python语言基础
python
129Lab8 分钟前
BMS 核心算法:SOC 估算从安时积分到 LSTM-UKF 串级融合的 30 年演进(附 Python 实现)
python·算法·lstm·python3.11·bms·soc估算
129Lab17 分钟前
电池热管理仿真的AI加速:用Python+PINN物理信息神经网络替代传统CFD的可行性探索
pytorch·python·cfd·pinn·物理信息神经网络·仿真加速·电池热管理
代码山河26 分钟前
Java学习路线图:2026年最新版,从入门到架构师
java·学习·架构·教程·面向对象·项目
用户2986985301430 分钟前
Python 中 HTML 转 PDF 的实现方法
python·html·api
sunoo-22933 分钟前
【嵌入式Linux驱动学习】Day1-Day2 全流程梳理:环境搭建→U-Boot→内核→根文件系统→驱动基础
linux·运维·驱动开发·笔记·学习·阿里云·恩智浦
我命由我1234540 分钟前
Photoshop - Photoshop 使用简单的选择工具
学习·职场和发展·产品运营·求职招聘·职场发展·学习方法·photoshop
答案是你40 分钟前
YOLOE 开放词汇检测 + ONNX / TensorRT 推理,开源了!
python·深度学习·yolo·目标检测·计算机视觉·视觉检测
2601_962885721 小时前
AlphaFeed 支持哪些 K 线周期?period参数怎么传?
前端·数据库·python