浅析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 str与repr的区别
Mar 23 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
神经网络相关之基础概念的讲解
Dec 29 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
基于python实现雪花算法过程详解
Nov 16 Python
使用NumPy读取MNIST数据的实现代码示例
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+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
python使用配置文件过程详解
2019/12/28 Python
Pytorch之contiguous的用法
2019/12/31 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
行政管理人员精品工作推荐信
2013/11/04 职场文书
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis