浅析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 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
python进阶教程之模块(module)介绍
Aug 30 Python
Django接收自定义http header过程详解
Aug 23 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python str字符串转uuid实例
Mar 03 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
Python使用jpype模块调用jar包过程解析
Jul 29 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
如何在Win10系统使用Python3连接Hive
Oct 15 Python
一个入门级python爬虫教程详解
Jan 27 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 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
javascript操作文本框readOnly
2007/05/15 Javascript
jquery $.ajax入门应用二
2008/11/19 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
Python找出9个连续的空闲端口
2016/02/01 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
一份报关员的职业规划范文
2014/01/08 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
大学生军训广播稿
2014/01/24 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
初三语文教学反思
2016/03/03 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL