• python对象持久化shelve模块


    1 python对象持久化shelve模块

    1.1 python序列化对象

    序列化对象:将对象转换为可以存储或传输的形式。

    (1) 用于存储:将对象的字节序列存储到文件中,程序退出后不会消失,便于后续使用。

    (2) 用于传输:发送方把对象转换为字节序列,接收方字节序列恢复为对象。

    反序列化:将存储或传输的字节序列恢复为对象。

    NO模块描述
    1picklepython对象和字节串间的序列化
    2dbm通过键访问文件,用于存储字符串
    3shelve使用pickle和dbm按照键将python对象存储到文件

    python的pickle模块是对象格式化和解格式化工具。

    对象格式化:将对象转换为字节串。

    解格式化:用字节串创建原始对象。

    把对象转为pickle字符串,存储在文件中,进行持久化保存。

    从文件载入pickle字符串,通过unpickle操作,创建原始对象。

    shelve将pickle字符串,按键值模式,存储在dbm文件中。

    shelve从dbm文件按键获取pickle字符串,创建原始对象。

    shelve通过键存储和获取本地python对象,到达跨程序运行和持久化的效果。

    python通过shelve模块将python对象存储到本地文件,以及从本地文件恢复python对象。

    1.2 shelve存储python对象

    用法

    import shelve
    db=shelve.open(filename, flag='c', protocol=None, writeback=False)
    db['k']=value
    db.close
    with shelve.open(filename, flag='c', protocol=None, writeback=False) as db:
        db['k']=value
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    描述

    import shelve:导入shelve模块

    filename:文件名,生成shelve文件时的名字

    flag:

    NOflag值描述
    1r只读模式打开文件
    2w读写模式打开文件
    3c读写模式打开文件,文件不存在则新建
    4n创建一个新的、空数据的文件

    protocol:序列化模式,1或2表示二进制形式

    writeback:缓存回写。True,表示在close的时候,将缓存中的全部对象重新写入到shelve文件。

    db**[‘k’]=**value:字典方式赋值向shelve文件写数据

    db**.**close:关闭文件连接

    生成.bak,.dat,.dir文件。

    示例

    >>> import os
    >>> os.chdir(r'E:\documents\F盘')
    >>> from myperson import MyPerson,MyManager
    >>> import shelve
    >>> mp1 = MyPerson('mp1')
    >>> mp2 = MyPerson('mp2','c++开发',20000)
    >>> mm1 = MyManager('mm1','开发经理',50000)
    # 普通open()
    >>> sdb = shelve.open('mypersondb')
    >>> for obj in (mp1,mp2,mm1):
        sdb[obj.name] = obj
    >>> sdb.close()
    >>> import glob
    >>> glob.glob('myperson*')
    # 生成 .bak,.dat,.dir 文件
    ['myperson.py', 'mypersondb.bak', 'mypersondb.dat', 'mypersondb.dir']
    # with shelve.open()
    >>> with shelve.open('withopendb') as wdb:
        for obj in (mp1,mp2,mm1):
            wdb[obj.name] = obj
    >>> glob.glob('withopen*')
    ['withopendb.bak', 'withopendb.dat', 'withopendb.dir']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1.3 读取shelve文件

    打开shelve文件后,跟使用字典一样访问数据。

    可以用[]或get读取数据。

    >>> rdb = shelve.open('mypersondb')
    >>> len(rdb)
    3
    >>> list(rdb.keys())
    ['mp1', 'mp2', 'mm1']
    >>> for k in rdb:
        print(k,'->',rdb[k])#[]获取字典数据
    mp1 -> MyPerson:job=None,name=mp1,pay=0
    mp2 -> MyPerson:job=c++开发,name=mp2,pay=20000
    mm1 -> MyManager:job=开发经理,name=mm1,pay=50000
    rdb.close()
    
    >>> with shelve.open('mypersondb') as srdb:
        for k in srdb:
            print(k,'->',srdb.get(k))#get 获取字典数据
    mp1 -> MyPerson:job=None,name=mp1,pay=0
    mp2 -> MyPerson:job=c++开发,name=mp2,pay=20000
    mm1 -> MyManager:job=开发经理,name=mm1,pay=50000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    1.4 更新shelve文件

    可以调用shelve文件存储的python对象所有的方法更新对象数据。

    NOwritebacke描述
    1False通过中间变量存放对象并进行更新,之后再指向中间变量,close后进行保存。
    2True可以不用中间变量,close的时候会自动将缓存中全部对象重新写到shelve文件。
    >>> rdb = shelve.open('mypersondb')
    # 从shelve文件获取对象,用中变量存放
    >>> mm1=rdb['mm1']
    >>> print(mm1)
    MyManager:job=开发经理,name=mm1,pay=50000
    >>> type(mm1)
    <class 'myperson.MyManager'>
    # 调用对象方法更新数据
    >>> mm1.payraise(0.1)
    # 更新shelve对象指向最新的对象
    >>> rdb['mm1']=mm1
    # close()后保存shelve文件
    >>> rdb.close()
    >>> rdb = shelve.open('mypersondb')
    >>> print(rdb['mm1'])
    # 获取的对象为更新后的对象
    MyManager:job=开发经理,name=mm1,pay=60000
    >>> rdb.close()
    # writebacke=True,close时自动将缓存数据重新写到shelve文件。
    >>> rdb = shelve.open('mypersondb',writeback=True)
    >>> print(rdb['mm1'])
    MyManager:job=开发经理,name=mm1,pay=60000
    >>> rdb['mm1'].payraise(0.1)
    >>> rdb.close()
    >>> rdb = shelve.open('mypersondb')
    >>> print(rdb['mm1'])
    MyManager:job=开发经理,name=mm1,pay=72000
    >>> rdb.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    高效工具-常用
    设置工作模式与环境(中):建造二级引导器
    React源码分析1-jsx转换及React.createElement
    AI短视频矩阵运营软件|抖音视频矩阵控制工具
    CFAR检测MATLAB仿真
    为何面试官总是将你简历上的技术问题问到回答不出来为止?
    java高版本下各种JNDI Bypass方法复现
    Django与Ajax
    目标检测——YOLOv7算法解读
    MMSegmentation系列之训练与推理自己的数据集(三)
  • 原文地址:https://blog.csdn.net/sinat_34735632/article/details/134342477