浅析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中设置变量访问权限的方法
Apr 27 Python
Python类属性与实例属性用法分析
May 09 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
python实现各种插值法(数值分析)
Jul 30 Python
django 环境变量配置过程详解
Aug 06 Python
centos7之Python3.74安装教程
Aug 15 Python
Django中ORM的基本使用教程
Dec 22 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 Python
python自动化测试通过日志3分钟定位bug
Nov 20 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中把对象数组转换成普通数组的方法
2015/07/10 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
Javascript面向对象之四 继承
2011/02/08 Javascript
JS高级笔记
2011/07/13 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python轻松实现代码编码格式转换
2015/03/26 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
python实现猜单词小游戏
2020/05/22 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
python修改文件内容的3种方法详解
2019/11/15 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
JAVA程序员面试题
2012/10/03 面试题
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
优秀教师个人材料
2014/12/15 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
golang定时器
2022/04/14 Golang
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技