浅析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爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
深入理解Python 代码优化详解
Oct 27 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
python实现LRU热点缓存及原理
Oct 29 Python
python 有效的括号的实现代码示例
Nov 11 Python
python实现学生管理系统开发
Jul 24 Python
Matplotlib animation模块实现动态图
Feb 25 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
python保存文件方法小结
2018/07/27 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
盛大笔试题
2016/11/05 面试题
夜大毕业生自我鉴定
2013/10/31 职场文书
女方回门宴答谢词
2014/01/14 职场文书
迎八一活动主题
2014/01/31 职场文书
职工运动会邀请函
2014/02/02 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
2015毕业寄语大全
2015/02/26 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书