浅析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中 ? : 三元表达式的使用介绍
Oct 09 Python
Python程序设计入门(2)变量类型简介
Jun 16 Python
Python程序员开发中常犯的10个错误
Jul 07 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
解决DataFrame排序sort的问题
Jun 07 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 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/02/08 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
jQuery实现点击关注和取消功能
2017/07/03 jQuery
js实现音乐播放控制条
2017/09/09 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
JPA的优势都有哪些
2013/07/04 面试题
快递员岗位职责
2014/09/12 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
投资申请报告
2015/05/19 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书