浅析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读取Excel的方法实例分析
Jul 11 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
python操作日志的封装方法(两种方法)
May 23 Python
使用python实现简单五子棋游戏
Jun 18 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
Python有参函数使用代码实例
Jan 06 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
在keras里实现自定义上采样层
Jun 28 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
django上传文件的三种方式
Apr 29 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使用pdo连接mssql server数据库实例
2014/12/25 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
浅析vue数据绑定
2017/01/17 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
vue实现放大镜效果
2020/09/17 Javascript
小程序实现tab标签页
2020/11/16 Javascript
python 爬取微信文章
2016/01/30 Python
python Matplotlib模块的使用
2020/09/16 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
新浪微博实习心得体会
2014/01/27 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
投标人廉洁自律承诺书
2014/05/26 职场文书
就业推荐表导师评语
2014/12/31 职场文书
车间主任岗位职责
2015/02/03 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书