住房和城乡建设部建造师网站,做服装团购有哪些网站,自豪的使用WordPress,wordpress注册登录一、概述前面章节我们讲述了json和pickle模块的序列化和反序列化处理#xff0c;他们有一个不足是在python 3中不能多次dump和load#xff0c;shelve模块则可以规避这个问题。shelve模块是一个简单的k,v将内存数据通过文件持久化的模块#xff0c;可以持久化任何pickle可支持…一、概述前面章节我们讲述了json和pickle模块的序列化和反序列化处理他们有一个不足是在python 3中不能多次dump和loadshelve模块则可以规避这个问题。shelve模块是一个简单的k,v将内存数据通过文件持久化的模块可以持久化任何pickle可支持的python数据格式是pickle 更上一层的封装。二、shelve模块的用法Shelve模块提供了基本的存储操作Shelve中的open函数在调用的时候返回一个shelf对象通过该对象可以存储内容即像操作字典一样进行存储操作。当在该对象中查找元素时对象会根据已经存储的版本进行重新构建当给某个键赋值的时候元素会被存储。持久化存储 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 with shelve.open(shelve_demo) as data:10 data[name] name11 data[info] info12 data[func] member_info代码执行后会生成三个文件其中shelve_demo.bak和shelve_demo.dir文件内容相同显示如下 1 name, (0, 43)2 info, (512, 45)3 func, (1024, 27)shelve_demo.dat猜测为类数据库文件把。解析文件内容 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 with shelve.open(shelve_demo) as data:7 print(data[name]) #这里的key与之前保存的文件内容里面的key完全对应,否则会报错8 print(data[info])9 print(data[func](Alex, 22))10 11 #运行结果输出:12 [Jack, Maxwell, Tom]13 {name: Maxwell, age: 18}14 Member info: Alex 2215 Nonevalue值的修改一般情况下我们通过shelve来open一个对象后只能进行一次赋值处理赋值后不能再次更新处理。 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 with shelve.open(shelve_demo) as data:10 data[name] name11 data[info] info12 data[name].append(Alex)13 print(data[name])14 15 程序输出16 [Jack, Maxwell, Tom] #第一次赋值后apend的元素并没有生效再次open打开结果也是这样 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 10 with shelve.open(shelve_demo) as data:11 print(data[name])造成上述情况的原因是我们只是修改了shelve对象的副本而它并木有被最终保存。此时我们除了下文要讲述的update方法外还有以下两种方法方法一 shelve open一个对象后先用临时变量指向对象副本在临时变量上修改后让对象副本再次指向临时变量从而覆盖保存对象副本。这种方法的本质是对open后的对象重新赋新值并非在原有基础上进行update也就是open后的对象内存指向地址发生了变化。 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 with shelve.open(shelve_demo) as data:10 data[name] name11 data[info] info12 temp data[name] #这里的关键点在于对临时变量的使用13 temp.append(Alex)14 data[name] temp15 print(data[name])16 17 程序输出18 [Jack, Maxwell, Tom, Alex]方法二借助open的writebackTrue参数来实现默认情况下该参数的值为False。 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 with shelve.open(shelve_demo, writebackTrue) as data:10 data[name] name11 data[info] info12 data[name].append(Alex)13 print(data[name])14 15 程序输出16 [Jack, Maxwell, Tom, Alex]update方法value值的更新还有一个update方法使用起来也比较方便 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 with shelve.open(shelve_demo, writebackTrue) as data:10 data[name] name11 data[info] info12 data.update({name:[Jack, Maxwell, Tom, Alex]}) #这里也是重新赋值13 print(data[name])14 15 程序输出16 [Jack, Maxwell, Tom, Alex]重新load一下看看结果 1 import shelve2 3 def member_info(name, age):4 print(Member info:, name, age)5 6 name [Jack, Maxwell, Tom]7 info {name:Maxwell, age:18}8 9 10 with shelve.open(shelve_demo) as data:11 print(data[name])12 13 程序输出14 [Jack, Maxwell, Tom, Alex]get方法通过shelve.open反序列化load对象到内存后可以通过get方法来获取key对应的value 1 __author__ Maxwell2 3 import shelve4 5 def member_info(name, age):6 print(Member info:, name, age)7 8 name [Jack, Maxwell, Tom]9 info {name:Maxwell, age:18}10 11 12 with shelve.open(shelve_demo) as data:13 print(data.get(name))14 15 程序输出16 [Jack, Maxwell, Tom, Alex]三、总结shelve概念总结shelve模块可以看做是pickle模块的升级版因为shelve使用的就是pickle的序列化协议但是shelve比pickle提供的操作方式更加简单、方便。shelve模块相对于其它两个模块在将Python数据持久化到本地磁盘时有一个很明显的优点就是它允许我们可以像操作dict一样操作被序列化的数据而不必一次性的保存或读取所有数据。shelve模块持久化支持更多的python数据类型使用建议需要与外部系统交互时用json模块需要将少量、简单Python数据持久化到本地磁盘文件时可以考虑用pickle模块需要将大量Python数据持久化到本地磁盘文件或需要一些简单的类似数据库的增删改查功能时可以考虑用shelve模块。以上内容摘自大神博客http://www.cnblogs.com/yyds/p/6563608.html转载于:https://www.cnblogs.com/linupython/p/8273858.html