少说话多写代码之Python学习063——标准模块(shelve模块)

栏目: Python · 发布时间: 5年前

内容简介:如果我们只需要存少量的数据,一个简单的存储方案是使用shelve模版。我们只需要给他提供一个指定路径的文件名。shelve调用过程是,先调用open函数,参数为文件名。返回值是一个shell对象。这个对象可以用来存储数据,可以作为一个字典来操作,但是键一定是字符串类型的。操作完成后调用close函数。看下shelve的简单使用,第一段代码中,d不见了,因为当用shell对象查找元素时,这个对象根据已经存储的版本进行构建,当给某个键时,被存储了。

如果我们只需要存少量的数据,一个简单的存储方案是使用shelve模版。我们只需要给他提供一个指定路径的文件名。shelve调用过程是,

先调用open函数,参数为文件名。返回值是一个 shell 对象。这个对象可以用来存储数据,可以作为一个字典来操作,但是键一定是字符串类型的。操作完成后调用close函数。看下shelve的简单使用,

import  shelve
#参数为文件名,会在当前运行目录下创建三个文件
#test.dat.bak
#test.dat.dat
#test.dat.dir
s=shelve.open('test.dat')
s['x'] = ['a','b','c']
s['x'].append('d')
print(s['x'])
输出
['a', 'b', 'c']

temp=s['x']
temp.append('d')
s['x']=temp
print(s['x'])
输出
['a', 'b', 'c', 'd']

第一段代码中,d不见了,因为当用shell对象查找元素时,这个对象根据已经存储的版本进行构建,当给某个键时,被存储了。

上述过程如下,

['a','b','c']赋值给x键;

d添加时,当前版本并未保存;

获取值时,获取的是原始版本,因此d不见了。

而第二段,temp是副本,副本修改后,重新保存了,所以能获取到d。我们再通过这个例子,看看shelve实现简单的数据存储。

如下,使用shelve模版模拟简单数据库的使用。

import sys,shelve
def store_person(db):
    """
    Query user for data store it in the shelf object
    """
    pid=input("输入唯一编码:")
    person={}
    person['name'] =input('请输入姓名:')
    person['age']=input('请输入年龄:')
    person['phone']=input('请输入电话号码:')
    db[pid]= person

def lookup_person(db):
        """
          Query user for id and desired field,and fetch the corresponding data form the shelf object
          """
        pid = input('输入唯一编码:')
        field=input('以下信息请输入:(name,age,phone)')
        field=field.strip().lower()
        print(field.capitalize()+':',\
              db[pid][field])

def print_help():
        print('有效的命令有:')
        print('store: 保存一个person对象')
        print('lookup: 通过id查询一个person对象')
        print('quit: 保存退出')
        print('?:显示帮助信息')

def endter_command():
        cmd=input('输入命令:(按?请求帮助)')
        cmd=cmd.strip().lower()
        return  cmd

def main():
        #此处路径根据实际的文件路径更改,不用提前创建该文件,会自动创建
        #D:\\work\\Python\\是我本地电脑存在的目录,大家测试可以自行修改目录
        database= shelve.open('D:\\work\\Python\\database.dat')
        try:
            while True:
                cmd=endter_command()
                if cmd=='store':
                    store_person(database)
                elif cmd=='lookup':
                    lookup_person(database)
                elif cmd=='?':
                    print_help()
                elif cmd =='quit':
                    return
        finally:
            database.close()
#调用
main()

操作输出如下

输入命令:(按?请求帮助)?
有效的命令有:
store: 保存一个person对象
lookup: 通过id查询一个person对象
quit: 保存退出
?:显示帮助信息
输入命令:(按?请求帮助)store
输入唯一编码:1
请输入姓名:yangyoushan
请输入年龄:31
请输入电话号码:13011111
输入命令:(按?请求帮助)lookup
输入唯一编码:1
以下信息请输入:(name,age,phone)name
Name: yangyoushan
输入命令:(按?请求帮助)quit

功能文件下载: https://download.csdn.net/download/yysyangyangyangshan/10860069


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

素数之恋

素数之恋

(美)约翰·德比希尔 / 陈为蓬 / 上海科技教育出版社 / 2008-12-01 / 34.00元

1859年8月,没什么名气的32岁数学家黎曼向柏林科学院提交了一篇论文,题为“论小于一个给定值的素数的个数”。在这篇论文的中间部分,黎曼作了一个附带的备注——一个猜测,一个假设。他向那天被召集来审查论文的数学家们抛出的这个问题,结果在随后的年代里给无数的学者产生了近乎残酷的压力。时至今日,在经历了150年的认真研究和极力探索后,这个问题仍然悬而未决。这个假设成立还是不成立? 已经越来越清楚,......一起来看看 《素数之恋》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具