pyhton模块-shelve

1.shelve简介

  shelve是Python当中数据储存的方案,类似key-value数据库,便于保存Python对象,shelve只有一个open()函数,用来打开指定的文件(字典),会返回一个对象shelf,shelf也是类似字典的对象。

  简单来说shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式,可以说是一个pickle的一个封装加强版。后面也会对比shelve和pickle的一个很主要的区别。

 

2.open()函数

  open()函数的格式:shelve.open(file_name, flag='', writeback=True\False)

  file_name:文件名

  flag:打开数据存储文件的格式:

  (1)、flag='r' 只读模式打开存在数据的文件

  (2)、flag='w'读写模式打开存在数据的文件

  (3)、flag='c'读写模式打开存在数据的文件,如果不存在则创建

  (4)、flag='n'总是创建一个新的、空数据的文件

  writeback:一般情况下,我们通过shelve.open()一个对象后,只能进行一次赋值,但是可以通过设定writeback:True来实现,这里writeback的默认值为False。

 

3.演示

  序列化对象代码

import shelve
 
d = shelve.open('shelve_test') #打开一个文件
 
class Test(object):
    def __init__(self,n):
        self.n = n
 
 
t1 = Test(123) 
t2 = Test(456)
 
name = ["lizexiong","rain","test"]
d["test"] = name #持久化列表
d["t1"] = t1      #持久化类
d["t2"] = t2
 
d.close()

  执行一下,多出了三个文件

  

  现在演示,在命令行获取。

  (3.7.5后貌似不能持久化类了,所以这里没有演示,具体细节麻烦大佬们自己翻看官网吧)

  

  差不多就是这个样子,和pickle功能差不多,持久化了一个列表

  为什么感觉没啥大用?平时我们使用pickle的dump和load的时候,是不是dump一次,在load一次?如果要dump两次呢?前一次dump的数据被覆盖了?其实并没有,这里用2个文件演示一下。

  先dump3次,是否前面两次会被最后一次的dump覆盖呢?

  

  现在load看看

  

   看到了哈,pickle虽然不说覆盖,但是按照dump的顺序load的,可以看出差别了吧,shelve可以指定key来读取,而不是按照顺序,好处就在这里

 

 

posted @ 2022-09-10 23:08  小家电维修  阅读(64)  评论(0编辑  收藏  举报