Python 序列化模块(json,pickle,shelve)
json模块
JSON (JavaScript Object Notation):是一个轻量级的数据交换格式模块,受javascript对象文本语法启发,但不属于JavaScript的子集。
常用方法:
dump(obj,fp):将对象以字符串的形式写入文件中。
load(fp):将数据从文件中读出,并返回(需要变量接收)数据的原类型。
dumps(obj):将对象转换成json字符串形式。
loads(str):将json字符串数据转换成原来的数据类型。
实例如下:dumps(obj) | loads(str)
import json
dict_1 = {"电影":"黄飞鸿","电视剧":"霍元甲"}
json_str = json.dumps(dict_1) # 将字典转换成json的字符串类型
dict_2 = json.loads(json_str) # 将json的字符串类型转换成原数据
print(json_str,type(json_str))
print(dict_2.items(),type(dict_2))
# 打印内容如下
{"\u7535\u5f71": "\u9ec4\u98de\u9e3f", "\u7535\u89c6\u5267": "\u970d\u5143\u7532"} <class 'str'>
dict_items([('电影', '黄飞鸿'), ('电视剧', '霍元甲')]) <class 'dict'>
实例如下:dump(obj,fp) | load(fp)
import json
# 向文件中写入json数据 dict_1 = {"电影":"黄飞鸿","电视剧":"霍元甲"} file_write = open("json.txt",mode="w",encoding="utf-8") json.dump(dict_1,file_write) # 将字典以json的字符串类型写入文件 file_write.close()
# 从文件中读取json数据 file_read = open("json.txt",mode="r",encoding="utf-8") dict_2 = json.load(file_read) # 将文件中内容转换成原数据类型并返回 file_read.close() print(dict_2.items(),type(dict_2)) # 打印转换后的数据 # 打印内容如下
dict_items([('电影', '黄飞鸿'), ('电视剧', '霍元甲')]) <class 'dict'>
这里需要注意的是json模块dump(obj,fp)虽然可以多次上传,但是在load时会报错,load(fp)函数不能转换多次dump的数据。所以如果想要向json文件中新增数据时,需要将数据load下来转换成原数据,然后在原数据基础上进行新增。最后将处理后的数据dump覆盖写到文件中。
pickle模块:
属于python专有的模块,用法,功能与json类似。
常用方法:
dump(obj,fp):将对象以字符串的形式写入文件中。
load(fp):将数据从文件中读出,并返回(需要变量接收)。
dumps(obj):将对象转换成json字符串形式。
loads(str):将json字符串数据转换成原来的数据类型。
dump(obj,fp) | load(fp) 示例如下;
import pickle
# 将数据以json方式写入文件 dict_1 = {"电影":"黄飞鸿","电视剧":"霍元甲"} file_write = open("pickle.txt",mode="wb") pickle.dump(dict_1,file_write) # 将字典以字节的形式写入文件 file_write.close()
# 从文件中以json方式读取数据 file_read = open("pickle.txt",mode="rb") dict_2 = pickle.load(file_read) # 将文件中内容转换成原数据类型并返回 file_read.close() print(dict_2.items(),type(dict_2)) # 打印转换后的数据 # 打印内容如下
dict_items([('电影', '黄飞鸿'), ('电视剧', '霍元甲')]) <class 'dict'>
dumps(obj) | loads(obj) 示例如下;
import pickle
dict_1 = {"电影":"黄飞鸿"}
pickle_byte = pickle.dumps(dict_1) # 将字典转换成pickle字节
print(pickle_byte)
# 将pickle字节转换成原数据
dict_2 = pickle.loads(pickle_byte)
print(dict_2.items(),type(dict_2)) # 打印转换后的数据
# 打印内容如下
b'\x80\x03}q\x00X\x06\x00\x00\x00\xe7\x94\xb5\xe5\xbd\xb1q\x01X\t\x00\x00\x00\xe9\xbb\x84\xe9\xa3\x9e\xe9\xb8\xbfq\x02s.'
dict_items([('电影', '黄飞鸿')]) <class 'dict'>
与json不同的是pickle可以多次dump多次load,如下:
import pickle
dict_1 = {"电影":"黄飞鸿"}
dict_3 = {"电视剧":"霍元甲"}
dict_5 = {"动画片":"葫芦娃"}
file_write = open("pickle.txt",mode="wb")
pickle.dump(dict_1,file_write) # 将dict_1以字节的形式写入文件
pickle.dump(dict_3,file_write) # 将dict_3以字节的形式写入文件
pickle.dump(dict_5,file_write) # 将dict_5以字节的形式写入文件
file_write.close()
file_read = open("pickle.txt",mode="rb")
dict_2 = pickle.load(file_read) # 将文件中内容转换成原数据类型并返回
dict_4 = pickle.load(file_read) # 将文件中内容转换成原数据类型并返回
dict_6 = pickle.load(file_read) # 将文件中内容转换成原数据类型并返回
file_read.close()
print(dict_2.items(),type(dict_2)) # 打印转换后的数据
print(dict_4.items(),type(dict_4)) # 打印转换后的数据
print(dict_6.items(),type(dict_4)) # 打印转换后的数据
# 打印内容如下
dict_items([('电影', '黄飞鸿')]) <class 'dict'>
dict_items([('电视剧', '霍元甲')]) <class 'dict'>
dict_items([('动画片', '葫芦娃')]) <class 'dict'>
小结:
1、json属于通用的模块,Java,JS等其它语言也支持。
pickle是Python私有的,只支持Python。
2、json将对象转换成json字符串类型。
pickle将对象转换成pickle字节类型。
3、json只能转换dict,list,tuple,str,int,float,bool值等简单数据类型
pickle能转换除了lamda以外的所有已知数据类型。
4、json虽然可以多次dump但是load会报错(这是最大的伤)。
pickle可以多次dump,多次load。
shelve模块
使用json或者pickle持久化数据,能dump多次,但load的话只能取到最新的dump, 因为先前的数据已经被后面dump的数据覆盖掉了。如果想要实现dump多次不被覆盖,就可以想到使用shelve模块。shelve模块可以持久化所有pickle所支持的数据类型。另外,写程序的时候如果不想用关系数据库那种重量级的去存储数据,也可以用到shelve。
shelve是用key来访问的,使用起来和字典类似。 要注意的是,在shelve模块中,key必须为字符串,而值可以是python所支持的数据类型。
另外,shelve其实用anydbm去创建DB并且管理持久化对象的。
shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。 可以像字典一样使用get来获取数据等。
如下操作:
import shelve
f_shelve = shelve.open('shelve') # 创建一个文件句柄
f_shelve["name"] = "小明" # 向文件中存放数据
f_shelve["age"] = 21 # 向文件中存放数据
f_shelve["sex"] = "男"
运行后会生成3个文件:shelve.bak shelve.dat shelve.dir,如下:

shelve.dat 存储的就是b字节数据类型的数据。bak和dir后缀从字面上看是备份和目录,具体做什么的不是很清楚。
当我们写好数据后,如何读取呢?
import shelve
f_shelve = shelve.open('shelve') # 创建一个文件句柄
# 打印文件内容,和类型
print(f_shelve["name"],f_shelve["age"],f_shelve["sex"],type(f_shelve))
# 打印内容如下
小明 21 男 <class 'shelve.DbfilenameShelf'>
既然f_shelve类似于字典,那我们也可以使用for循环进行打印,如下:
import shelve
f_shelve = shelve.open('shelve') # 创建一个文件句柄
# 使用for循环打印内容
for k,v in f_shelve.items():
print(k,v)
# 打印内容如下
name 小明
age 21
sex 男
f_shelve现在是一个特殊的文件句柄,它可以执行字典的多数方法,对文件里的数据进行操作。
import shelve
f_shelve = shelve.open('shelve') # 创建一个文件句柄
f_shelve["list"] = [1,2,3] # 向文件中添加数据列表
f_shelve["list"].append("abc") # 向列表中追加内容.
f_shelve["list"].pop(1) # 从列表中删除一个元素
f_shelve["name"] = "小明" # 向文件中追加内容
f_shelve["name"] = "小红" # 修改name所对应的值
print(f_shelve["list"],f_shelve["name"],sep="\n")
# 打印内容如下
[1, 2, 3]
小红
通过上面的打印内容我们可以发现,我们将列表写入文件后,然后在读取出来进行追加和删除元素,并没有对文件产生影响,文件中的列表内容还是原来的值。而我们向文件中添加字符串时,在读取出来对字符串进行修改发现数据被修改了。
由此我们可以知道在向文件中写入一个可变的数据时,如果读取出来对数据进行修改只是在内存中的修改,修改后的数据并没有被真正写入到文件中。那么我们该如何进行操作呢?这时就需要回写了。
import shelve
# 创建一个特殊的文件句柄,并添加回写功能
f_shelve = shelve.open('shelve',writeback=True) # 启用会写
f_shelve["list"] = [1,2,3] # 向文件中添加数据列表
f_shelve["list"].append("abc") # 向列表中追加内容.
f_shelve["list"].pop(1) # 从列表中删除一个元素
print(f_shelve["list"])
# 打印内容如下
[1, 3, 'abc']
这回我们在修改列表时,可以看出列表的数据确实被修改了。
总结如下:
1、shelve模块将内存数据以字典的类型(key,value)通过文件持久化,模拟出简单的db效果。
2、shelve模块可以持久化任何pickle所支持的python数据格式,但是它的key必需得是字符串。
3、shelve可以看作是pickle模块的一个封装,但它实现了可以多次dump(后面的dump不会覆盖前面的)和多次load。
4、shelve访问己有key时,实际上取出的是数据源给出的一份拷贝,所以对于拷贝做出的增加和删除等操作都需要用writeback=True参数才能实现写入回文件中进行修改。
5、shelve对于d[key] = data这种操作,视为存储数据,无则新增,有则覆盖,对与访问key当中的值(条目)进行修改,默认不回写并不矛盾和冲突。
下一篇:模块os,sys,hashlib,collections的简单介绍:https://www.cnblogs.com/caesar-id/p/10427386.html
Python 序列化模块(json,pickle,shelve)的更多相关文章
- python序列化模块 json&&pickle&&shelve
#序列化模块 #what #什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程叫做序列化. #why #序列化的目的 ##1.以某种存储形式使自定义对象持久化 ##2.将对象从一个地方传递 ...
- python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)
一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...
- python序列化: json & pickle & shelve 模块
一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...
- python开发模块基础:序列化模块json,pickle,shelve
一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...
- Python序列化,json&pickle&shelve模块
1. 序列化说明 序列化可将非字符串的数据类型的数据进行存档,如字典.列表甚至是函数等等 反序列化,将通过序列化保存的文件内容反序列化即可得到数据原本的样子,可直接使用 2. Python中常用的序列 ...
- python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则
python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess ...
- python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)
1.昨日内容回顾 1.正则表达式 # 正则表达式 —— str # 检测字符串是否符合要求 # 从大段的文字中找到符合要求的内容 1).元字符 #. # 匹配除换行 ...
- day6_python序列化之 json & pickle & shelve 模块
一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...
- Day 21 序列化模块_Json,Pickle,Shelve
序列化 , 数据类型,列表 元组, 字符串 只有字符串能被写入文件中. 能在网络上传输的只能是bytes - 字符串 把要传输的和要存储的内容转换成字符串. 字符串 转换回 要传输和存储的内容 序列化 ...
- Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解
把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...
随机推荐
- php设计模式2
代理模式 <?php /** * 代理模式:为其他对象提供一个代理以控制这个对象的访问 它是给某一个对象提供一个替代者,使之在client对象和subject对象之间编码更有效率. 代理可以提供 ...
- CentOS7 Linux中通过加密grub防止黑客通过单用户系统破解root密码
如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 17.3.1 基于centos6进行grub加密 [root@63 ~]# gr ...
- c# 关于页面生命周期
每次遇到这个问题,总是含含糊糊的说不清楚,今天就在这里统一整理一下,以便以后的查看. 一般来说,页要经历下表概述的各个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于 ...
- 微信小程序开发测试
微信小程序 在2017-01-09正式上线,本着跟上时代潮流的精神,写一份教程来看看 微信IDE下载地址为: 微信IDE 在windows下直接 双击 exe安装即可,安装完成后的界面如下: 得到这个 ...
- android 缩放平移自定义View 显示图片
1.背景 现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户 ...
- CompletableFuture基本用法
异步计算 所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法.在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结 ...
- SignalR学习笔记(五) 横向扩展之SQL Server
当一个Web应用程序达到一台服务器能力限制,即请求处理数量限制之后,有2种解决方案:纵向扩展和横向扩展. 纵向扩展即用更强的服务器(或虚拟机),或为当前的服务器添加更多的内存,CPU等 横向扩展即添加 ...
- 文本主题模型之非负矩阵分解(NMF)
在文本主题模型之潜在语义索引(LSI)中,我们讲到LSI主题模型使用了奇异值分解,面临着高维度计算量太大的问题.这里我们就介绍另一种基于矩阵分解的主题模型:非负矩阵分解(NMF),它同样使用了矩阵分解 ...
- 你真的会PHP吗?
Note: 1) PHP中的数据类型 PHP一共支持八种数据类型, 4种标量类型,boolean(布尔型),integer(整形),float/double(浮点型)和string(字符串类型), 2 ...
- 补习系列(5)-springboot- restful应用
一.目标 了解 Restful 是什么,基本概念及风格: 能使用SpringBoot 实现一套基础的 Restful 风格接口: 利用Swagger 生成清晰的接口文档. 二.Restful 入门 什 ...