这是我参与8月更文挑战的第10天,活动详情查看: 8月更文挑战
回顾复习
Python目前支持序列化的模块有三个,我们在前面已经学习
🏹知识点:序列化有什么特性?
-
序列化的特性是,数据持久性
-
持久性:是指在多次执行程序之后仍然保持对象
-
持久性表现特点:日常办公,我们需要多次使用程序和文件,这些都是持久性的表现
本期,我们将学习Python提供对数据键值持久化处理的模块-shelve模块,其模块内部是使用pickle协议来实现数据序列化的
下雨天☔️,带上耳机🎧、播放音乐🎼,开始今天的学习之旅💃💃💃~
1. shelve模块概述
shelve是一个简单的数据存储方案,其对象shelf 是一个持久化数据存储对象,与字典类似,形式以key-value存在,便于保存Python数据类型的对象。
shelve模块内部实现是采用pickle模块的,我们来看看它们的异同点吧
shelve模块与pickle模块对比
-
相同点
(1)用于系统内部
pickle模块和shelve模块都是使用其特有的序列化协议,其序列化之后的数据只能被python识别,只能用于系统内部
(2)Python版本需要指定
因为pickle模块对于python版本不同,而支持的功能也不同。
也因为shelve模块内部是使用pickle协议。
所以,在python2和python3默认使用的序列协议也不同,需要兼容的话还需要指定协议的版本。
(3) 易于对自定义的数据类型进行序列化和反序列化操作
pickle模块和shelve模块相对于json来说,对于自定义数据类型可以直接序列化和反序列化,不需要编写额外的转换函数或类。
-
不同点
(1)提供简单易于的方法
shelve模块可以看作是pickle模块的升级版,因为shelve使用的就是pickle的序列化协议,但是shelve提供open函数就可以创建打开一个存储文件,比pickle操作方式更加简单、方便。
(2)读取写入数据方便
shelve模块相对于其它两个模块在将python数据持久化到本地磁盘时,可以像操作dict一样操作(key-value形式)被序列化的数据,而不必一次性的保存或读取所有的数据。
适用场景
(1)在与外部系统交接互用时用json模块。
(2)需要将少量、简单python数据持久化到本地磁盘文件时可以考虑用pickle模块。
(3)需要将大量python数据化持久到本地磁盘文件或需要一些简单的类似数据库的增删改查功能时,可以考虑用shelve模块。
2. shelve模块常用方法
shelve模块虽然比pickle模块简单,但是仍然提供
方法 | 作用 |
---|---|
shelve.open(filename) | 创建打开文件对象,可以向其写入key-value的数据 |
shelve.sync() | 如果shelf打开时,writeback为True则写回缓存中的所有条目 |
shelve.close() | 同步并关闭持久化dict对象 |
📢 重要说明:
-
shelve.open(filename):是shelve最主要方法,返回shelf对象
(1) shelf是一种持久的类似字典的对象
(2) shelf对象可以与上下文管理器with一起使用
(3) 通过key来写入value值到shelf对象里
(4) value值可以是任意的Python对象
(5) key值必须为字符串
(6) 文件类型必须是.bat,且默认是以读写模式打开
(6) shelve模块内部是由pickle模块来实现的
-
open flag 打开文件的模式有4种
模式 描述 "r" 只读模式打开已经存在的数据存储文件 "w" 读写模式下打开已经存在的数据存储文件 "c" 读写模式打开一个数据存储文件,如果不存在则创建 "n" 总是创建一个新的、空数据存储文件,并以读写模式打开
3. 小试牛刀
我们来使用shelve模块实现序列化和反序列化操作:
对数据进行序列化示例:
import shelve
with shelve.open("juejin.bat") as f:
f['name']= {"Anne","Juejin"}
f['day'] = [9,8,7]
对数据进行反序列化示例:
import shelve
f = shelve.open("juejin.bat")
existing = f['name']
f.close()
print(existing)
总结
本期,我们学习了Python对数据进行序列化和反序列化功能最简单的shelve模块
shelve模块提供open方法,简单快速创建存储数据文件对象,并且支持key-value形式来写入存储数据,我们在日常需要在本地向磁盘中写入数据时,可以使用此模块方法,操作简单上手
以上是本期内容,欢迎大佬们点赞评论ღ( ´・ᴗ・` )比心,下次见~💖💗💓