浅析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 12 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
使用 Python 遍历目录树的方法
Feb 29 Python
Python 绘制可视化折线图
Jul 22 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
selenium如何定位span元素的实现
Jan 13 Python
Python LMDB库的使用示例
Feb 14 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
Python+tkinter实现高清图片保存
Mar 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实现微信网页授权开发教程
2016/01/19 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python实现删除文件但保留指定文件
2015/06/21 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
理解python中生成器用法
2017/12/20 Python
python opencv之SIFT算法示例
2018/02/24 Python
python距离测量的方法
2018/03/06 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
企业员工薪酬方案
2014/06/04 职场文书
基层工作经验证明样本
2014/11/16 职场文书
绿色环保倡议书
2015/04/28 职场文书
校园安全学习心得体会
2016/01/18 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
接收函
2019/04/22 职场文书
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android