浅析Python 序列化与反序列化


Posted in Python onAugust 05, 2020

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态(存在内存中)写入到临时或持久性存储区(硬盘)。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

实现对象的序列化和反序列化在python中有两种方式:json 和 pickle。

其中json用于字符串 和 python数据类型间进行转换,pickle用于python特有的类型 和 python的数据类型间进行转换,pickle是python特有的。

1、JSON序列化:json.dumps()

info = {
  "name":"tj",
  "age":22
}
import json
print(info)
print(type(info))
print(json.dumps(info))
print(type(json.dumps(info)))

f = open("test.txt","w")
# f.write(info)  # TypeError: write() argument must be str, not dict
f.write(json.dumps(info)) # 正常写入文件 f.write(json.dumps(info)) 等价于 json.dump(info, f)
f.close()

>>>
{'name': 'tj', 'age': 22}
<class 'dict'>
{"name": "tj", "age": 22}
<class 'str'>

2、JSON反序列化:json.loads()

f = open("test.txt","r")
# print(f.read()["age"]) #TypeError: string indices must be integers
data = json.loads(f.read()) # data = json.loads(f.read()) 等价于 data = json.load(f)
print(data["age"])
f.close()

>>>
22

注意:对于以下这种情况json就不能处理了

import json
def hello(name):
  print("hello,",name)
info = {
  "name":"tj",
  "age":22,
  "func":hello
}
f = open("test2.txt","w")
f.write(json.dumps(info)) #TypeError: Object of type function is not JSON serializable
f.close()

所以:json用于字符串 和 python数据类型间进行转换

3、pickle序列化:pickle.dumps()

import pickle
def hello(name):
  print("hello,",name)
info = {
  "name":"tj",
  "age":22,
  "func":hello
}

print(pickle.dumps(info)) #可见pickle序列化的结果输出为二进制,所以应使用wb的方式往文件中写
f = open("test2.txt","wb")
f.write(pickle.dumps(info)) # 等价于 pickle.dump(info,f)
f.close()

>>>
b'\x80\x04\x957\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04alex\x94\x8c\x03age\x94K\x16\x8c\x04func\x94\x8c\x08__main__\x94\x8c\x05hello\x94\x93\x94u.'

对于函数hello,序列化的不是内存地址,而是整个数据对象,函数可以序列化。

4、pickle反序列化:pickle.loads()

f = open("test2.txt","rb")
data = pickle.loads(f.read()) # 等价于data = pickle.load(f)
print(data)
print(data["name"])
print(data["func"])

>>>
{'name': 'tj', 'age': 22, 'func': <function hello at 0x00000179EF69C040>}
tj
<function hello at 0x00000179EF69C040>

5、多次序列化与反序列化

1)json

import json
info = {
  "name":"tj",
  "age":22
}

f = open("test3.txt","w")
f.write(json.dumps(info))
info['age'] = 21
f.write(json.dumps(info))
f.close()
# 
>>>
序列化两次后test3中的内容
test3.txt: {"name": "tj", "age": 22}{"name": "tj", "age": 21}

f = open("test3.txt","r")
# 报错,py3以上,多次dumps的文件反序列化报错,py2多次dumps的文件也能被反序列化,先序列化的先被反序列化
data = json.loads(f.read()) # json.decoder.JSONDecodeError
f.close()
print(data)

2)pickle

import pickle

info = {
  "name":"tj",
  "age":22
}

f = open("test2.txt","wb")
f.write(pickle.dumps(info)) # 等价于 pickle.dump(info,f)
info["sex"] = "女"
f.write(pickle.dumps(info)) # 等价于 pickle.dump(info,f)
f.close()

>>>
序列化两次后test2.txt中的内容
test2.txt: ��    }�(�name??tj??age?Ku.��%    }�(�name??tj??age?K�sex??濂?u.

f = open("test2.txt","rb")
data = pickle.loads(f.read()) # 第一次反序列化正常
# data = pickle.loads(f.read()) # 第二次反序列化:EOFError: Ran out of input
print(data)
print(data["age"])
# print(data["sex"]) # KeyError: 'sex'

老王:是不是就不能多次序列化呢?那我修改后的数据还需要序列化写入到文件怎么办?

你:当然能多次序列化,把序列化后数据写到多个文件不就好了嘛。

以上就是浅析Python 序列化与反序列化的详细内容,更多关于Python 序列化与反序列化的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
python如何实现代码检查
Jun 28 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
Python装饰器原理与基本用法分析
Jan 07 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 Python
Python中使用ipython的详细教程
Jun 22 Python
python神经网络学习 使用Keras进行简单分类
May 04 Python
python 使用pandas读取csv文件的方法
Dec 24 Python
Python创建临时文件和文件夹
Aug 05 #Python
学习Python爬虫的几点建议
Aug 05 #Python
Python调用C/C++的方法解析
Aug 05 #Python
浅谈Python3中print函数的换行
Aug 05 #Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 #Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
Aug 05 #Python
Node.js 和 Python之间该选择哪个?
Aug 05 #Python
You might like
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
加载 Javascript 最佳实践
2011/10/30 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
Linux下为不同版本python安装第三方库
2016/08/31 Python
python的多重继承的理解
2017/08/06 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
python创建学生管理系统
2019/11/22 Python
Python Django view 两种return的实现方式
2020/03/16 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
SQL数据库笔试题
2016/03/08 面试题
实习生自我评价
2014/01/18 职场文书
两只小狮子教学反思
2014/02/05 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
个人党性分析总结
2015/03/05 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
医者仁心观后感
2015/06/17 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS