(1)shelve模块:
shelve是一个简单的数据存储方案,类似key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。shelve只有一个open()函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf对象。shelf是一种持久的、类似字典的对象。
(2)shelve模块的特点:
1、shelve模块只有一个open()函数;
2、shelve模块是一个简单的将内存数据通过文件持久化保存的模块;
3、shelve模块可以持久化任何pickle可支持的python数据格式。
(3)shelve模块中的open()函数:
格式为:shelve.open(filename,flag)
filename:文件名;
flag:打开数据存储文件的格式;
'r' 以只读模式打开一个已经存在的数据存储文件 'w' 以读写模式打开一个已经存在的数据存储文件 'c' 以读写模式打开一个数据存储文件,如果不存在则创建 'n' 总是创建一个新的、空数据存储文件,并以读写模式打开
(1)保存数据(数据持久化):
import shelve
name = ['Alce', 'Bob', 'Janice']
infos = {'name': 'Alice', 'age': 22,'hobby':'music'}
days=(31,28,31,30,31)
# 保存数据(数据持久化)
with shelve.open('shelve.txt') as f:
f['name'] = name # 持久化列表
f['infos'] = infos # 持久化字典
f['days']=days #持久化元组
执行代码之后会生成三个文件,分别是:shelve.txt.bak shelve.txt.dat shelve.txt.dir。
shelve.txt.bak的内容为:
'name', (0, 42) 'infos', (512, 67) 'days', (1024, 17)
shelve.txt.dat的内容为:
�]q (X AlceqX BobqX Janiceqe. �}q (X nameqX AliceqX ageqKX hobbyqX musicqu. �(KKKKKtq .
shelve.txt.dir的内容为:
'name', (0, 42) 'infos', (512, 67) 'days', (1024, 17)
(2)读取数据:
可以通过字典的形式获取数据
import shelve
with shelve.open('shelve.txt')as f:
for k,v in f.items():
print(k,':',v)
结果如下:
name : ['Alce', 'Bob', 'Janice']
infos : {'name': 'Alice', 'age': 22, 'hobby': 'music'}
days : (31, 28, 31, 30, 31)
我们也可以使用get的方式来获取数据
import shelve
with shelve.open('shelve.txt')as f:
name=f.get('name')
infos=f.get('infos')
days=f.get('days')
print(name)
print(infos)
print(days)
结果如下:
['Alce', 'Bob', 'Janice']
{'name': 'Alice', 'age': 22, 'hobby': 'music'}
(31, 28, 31, 30, 31)
如下例题是一个简单的登录系统,可以登录三次,登录成功后,可以添加一个学生的信息和修改密码,更新db文件的信息,然后保存到db文件中,下次读取是就是更新后的内容;
然后通过读取文件的内容,查看db文件中的信息,score和account;
import shelve
import random
#存入数据
with shelve.open('db')as db:
#scores为一个列表,如果score中有值,则scores=score,如果没有则scores=[]
scores= db.get("score",[])
#accounts为一个字典,如果account中有值,则accounts=account,如果没有则accounts={"admin":"12345"}
accounts=db.get('account',{"admin":"12345"})
for i in range(3):
id = input("用户名:")
password = input("密码:")
if id in accounts and accounts[id]==password:
print('成绩表为:',scores)
name = input("name:") #向列表中添加学生姓名
cj = random.randint(50, 100) #向列表中添加学生成绩
scores.append([name,cj])
print('成绩表为:',scores)
npass=input("新密码:")
db['score']=scores
db['account']={"admin":npass}
break
else:
print("用户名或密码错误")
else:
print("三次机会已用完,再见!")
#读取保存的数据信息
print('-'*20)
with shelve.open('db')as db:
for k,v in db.items():
print(k,':',v)
结果如下:
用户名:admin
密码:123
用户名或密码错误
用户名:admin
密码:12345
成绩表为: []
name:1
成绩表为: [['1', 83]]
新密码:11111
--------------------
score : [['1', 83]]
account : {'admin': '11111'}