<学习笔记>从零开始自学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
相关推荐
rellvera几秒前
【强化学习的数学原理】第02课-贝尔曼公式-笔记
笔记·机器学习
MessiGo2 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Mephisto.java11 分钟前
【大数据学习 | Spark-Core】Spark提交及运行流程
大数据·学习·spark
肥猪猪爸26 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
PandaCave36 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
yuwinter41 分钟前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
LZXCyrus1 小时前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm
Enougme1 小时前
Appium常用的使用方法(一)
python·appium
red_redemption1 小时前
自由学习记录(23)
学习·unity·lua·ab包
懷淰メ1 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5