浅析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使用matplotlib绘制动画的方法
May 20 Python
Python通过poll实现异步IO的方法
Jun 04 Python
python3 shelve模块的详解
Jul 08 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
pandas数据集的端到端处理
Feb 18 Python
python retrying模块的使用方法详解
Sep 25 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
详解Python中的进程和线程
Jun 23 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新手上路(四)
2006/10/09 PHP
20个PHP常用类库小结
2011/09/11 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
餐厅总经理岗位职责
2013/12/31 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
如何用Python搭建gRPC服务
2021/06/30 Python