浅析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实现支持目录FTP上传下载文件的方法
Jun 03 Python
python读取oracle函数返回值
Jul 18 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
tensorflow实现简单的卷积网络
May 24 Python
python list转矩阵的实例讲解
Aug 04 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
python机器学习包mlxtend的安装和配置详解
Aug 21 Python
python实现简易淘宝购物
Nov 22 Python
python实现连连看游戏
Feb 14 Python
python使用多线程+socket实现端口扫描
May 28 Python
python selenium xpath定位操作
Sep 01 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
php AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
SVG描边动画
2017/02/23 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
django2 快速安装指南分享
2018/01/05 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Python实现TCP通信的示例代码
2019/09/09 Python
python设置随机种子实例讲解
2019/09/12 Python
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
2013年大学生的自我鉴定
2013/10/24 职场文书
安全承诺书范文
2014/03/26 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
现场施工员岗位职责
2015/04/11 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
MySQL导致索引失效的几种情况
2022/06/25 MySQL
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android