python对象持久化shelve模块

2023-11-10 23:52

本文主要是介绍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']=valuepass

描述

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.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.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()

这篇关于python对象持久化shelve模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386133

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型: