day5-shelve模块
一、简述
之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,不能dump多次,和load多次,但是我们真想要dump多次和load多次怎么办呢,并且能事项数据的持久化呐?好吧,今天我们就来说说这个shelve模块。
二、shelve概念
1、持久化
1 2 3 4 5 6 7 8 9 10 11 12 13 | import shelve #导入shelve模块 def stu_data(name,age): #定义一个函数 print ( "register stu:" ,name,age) name = [ "test" , "zhang" , "qi" , "gao" ] #定义一个列表 info = { "name" : "zhangqigao" , "age" : 18 } #定义一个字典 with shelve. open ( "shelve_test" ) as d: d[ "test" ] = name #持久化列表 d[ "info" ] = info #持久化字典 d[ "func" ] = stu_data #持久化函数 |
代码执行结果:
生成三个文件夹,分别是:shelve_test.dir、shelve_test.dat、shelve_test.bak
①shelve_test.dir内容
1 2 3 | 'test' , ( 0 , 50 ) 'func' , ( 1024 , 24 ) 'info' , ( 512 , 48 ) |
②shelve_test.dat内容
1 2 3 4 5 6 | �]q (X testqX zhangqX qiqX gaoqe. �}q (X nameqX zhangqigaoqX ageqKu. �c__main__ stu_data q . |
③shelve_test.bak内容
1 2 3 | 'test' , ( 0 , 50 ) 'func' , ( 1024 , 24 ) 'info' , ( 512 , 48 ) |
2、解析文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import shelve def stu_data(name,age): #这边一定要定义相同名字的函数,不然执行报错 print ( "stu:" ,name,age) with shelve. open ( "shelve_test" ) as f: print (f[ 'test' ]) #解析列表 print (f[ 'info' ]) #解析字典 print (f[ "func" ]( "zhangqsan" , 22 )) #解析函数 #输出 [ 'test' , 'zhang' , 'qi' , 'gao' ] { 'age' : 18 , 'name' : 'zhangqigao' } stu: zhangqsan 22 None |
三、shelve模块使用
3.1、常用方法
1 2 3 4 5 6 7 8 9 10 11 12 | >>> import shelve >>> d = shelve. open ( "shelve_test" ) >>> dir (d) [ '_MutableMapping__marker' , '__abstractmethods__' , '__class__' , '__contains__' , '__del__' , '__delattr__' , '__delitem__' , '__dict__' , '__dir__' , '__doc__' , '__enter__' , '__eq__' , '__exit__' , '__format__' , '__ge__' , '__getattribute__' , '__getitem__' , '__gt__' , '__hash__' , '__init__' , '__iter__' , '__le__' , '__len__' , '__lt__' , '__module__' , '__ne__' , '__new__' , '__reduce__' , '__reduce_ex__' , '__repr__' , '__setattr__' , '__setitem__' , '__sizeof__' , '__slots__' , '__str__' , '__subclasshook__' , '__weakref__' , '_abc_cache' , '_abc_negative_cache' , '_abc_negative_cache_version' , '_abc_registry' , '_protocol' , 'cache' , 'clear' , 'close' , 'dict' , 'get' , 'items' , 'keyencoding' , 'keys' , 'pop' , 'popitem' , 'setdefault' , 'sync' , 'update' , 'values' , 'writeback' ] |
3.2、update
说明:update方法是如果序列化的值存在,则更新,如果不存在,则新增,用法:update({key:序列化对象})
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #dumps到文件中 import shelve info = { "name" : "zhangqigao" , "age" : 18 } with shelve. open ( "shelve_test" ) as d: d[ 'qigaotest' ] = info #变量存在 d.update({ 'qigaotest' : "shuaigaogao" }) #更新已经key为"qigaotest"的值 #loads到内存中 import shelve with shelve. open ( "shelve_test" ) as f: print (f.get( "qigaotest" )) #输出 shuaigaogao |
3.3、get
说明:把文件中的值load到内存中时,通过get它的key值获取
1 2 3 4 5 6 7 | import shelve with shelve. open ( "shelve_test" ) as f: print (f.get( "qigaotest" )) #或者是f["qigaotest"] #输出 shuaigaogao |
注意:如果是通过f["qigaotest"]这种方法取,如果值不存在则会报错,通过get去取,不存在,则会返回none
四、总结
- shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
- shelve模块可以持久化任何pickle可支持的python数据格式。
- shelve就是pickle模块的一个封装。
- shelve模块是可以多次dump和load。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端