浅析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类装饰器用法实例
Jun 04 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
浅谈flask源码之请求过程
Jul 26 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
Python中@property的理解和使用示例
Jun 11 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
树莓派3 搭建 django 服务器的实例
Aug 29 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
python学习之panda数据分析核心支持库
May 07 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对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
JS判定是否原生方法
2013/07/22 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
Python入门篇之对象类型
2014/10/17 Python
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
python实现清屏的方法
2015/04/30 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python自动化脚本安装指定版本python环境详解
2017/09/14 Python
python之Character string(实例讲解)
2017/09/25 Python
Tornado 多进程实现分析详解
2018/01/12 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
优秀员工自荐书
2013/12/19 职场文书
玩具公司的创业计划书
2013/12/31 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
冰峪沟导游词
2015/02/09 职场文书
监守自盗观后感
2015/06/10 职场文书
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript