<学习笔记>从零开始自学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
相关推荐
jackson凌2 分钟前
【Java学习笔记】【第一阶段项目实践】房屋出租系统(面向对象版本)
java·笔记·学习
冰茶_6 分钟前
掌握LINQ:查询语法与方法语法全解析
sql·学习·microsoft·微软·c#·linq
CryptoRzz12 分钟前
股票数据源对接技术指南:印度尼西亚、印度、韩国
数据库·python·金融·数据分析·区块链
胖哥真不错33 分钟前
Python实现NOA星雀优化算法优化卷积神经网络CNN回归模型项目实战
python·cnn·卷积神经网络·项目实战·cnn回归模型·noa星雀优化算法
卓律涤44 分钟前
【找工作系列①】【大四毕业】【复习】巩固JavaScript,了解ES6。
开发语言·前端·javascript·笔记·程序人生·职场和发展·es6
海尔辛1 小时前
学习黑客Active Directory 入门指南(一)
windows·学习·ad
love530love1 小时前
【笔记】记一次PyCharm的问题反馈
ide·人工智能·windows·笔记·python·pycharm
梦醒沉醉1 小时前
MCP(一)——QuickStart
python·mcp
照物华1 小时前
httpx[http2] 和 httpx 的核心区别及使用场景如下
python·httpx
笑鸿的学习笔记2 小时前
虚幻引擎5-Unreal Engine笔记之Pawn与胶囊体的关系
笔记·ue5·虚幻