Python编程——shelve模块的使用详解(附实例)

1. shelve模块的介绍

(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' 总是创建一个新的、空数据存储文件,并以读写模式打开

2. shelve模块的使用

(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)

3. shelve模块的应用实例

如下例题是一个简单的登录系统,可以登录三次,登录成功后,可以添加一个学生的信息和修改密码,更新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'}

 

你可能感兴趣的:(python编程)