Python之数据序列化(json、pickle、shelve)详解


Posted in Python onAugust 30, 2019

什么是序列化

什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等。程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输。

序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~

Python中序列化的模块

模块名称 描述 提供的api
json 用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load()
pickle 用于实现Python数据类型与Python特定二进制格式之间的转换 dumps()、dump()、loads()、load()
shelve 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 open()

json模块

大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。

json支持的数据格式有限,有int str list dict以及特殊的tuple(会将tuple转为list)

Json模块提供了四个功能:dumps、dump、loads、load

dumps和loads主要是在内存内操作,如下:

import json 
 list = ['a','b','c'] 
 list_str = json.dumps(list)
 print(list_str)   #["a", "b", "c"] 
 list2 = json.loads(list_str)
 print(list2)    #['a', 'b', 'c']

而dump和load是从文件内操作,如下:

import json
 list = ['a','b','c']
 with open('test','w',encoding='utf-8') as f:
   json.dump(list,f) 
 with open('test','r',encoding='utf-8') as f2:
   json.load(f2)

json模块中的字符编码问题

在Python3中,代码中的字符串都是使用 unicode 格式存放的,序列化之后也是以unicode 格式存放,所以序列化和反序列化过程都不存在问题。

Python2中,代码中的字符串是 str类型,str类型 和 unicode类型 的关系如下所示:

unicode -----> encode --------> str(例如为 utf-8编码)

utf-8(例如为 utf-8编码) --------> decode ----------> unicode

所以在Python2中,序列化过程和反序列化过程都有涉及到转码过程(encode和decode),序列化过程 会先将对象中的字符串 使用utf-8 进行解码(decode),转换为unicode类型后,再存放到文件或者字符串中,反序列化过程 会将 json字符串 使用utf-8 编码(encode),然后存放到内存中的变量~

pickle模块

用法与json类似,不过pickle不能跨语言,优点是它支持python所有的数据类型

需要注意的是,pickle是以bytes类型来进行序列化的

import pickle
 list = ['a','b','c']
 list_str = pickle.dumps(list)
 print(list_str)     #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
 
 list2 = pickle.loads(list_str)
 print(list2)      #['a', 'b', 'c']

而正因为pickle是以bytes类型进行序列化的,所以在用dump和load方法对文件进行写入或者反序列化的时候,要以wb或者rb模式打开,如下:

import pickle
 list = ['a','b','c']
 with open('test','wb') as f:
   pickle.dump(list,f) 
 with open('test','rb') as f2:
   pickle.load(f2)

shelve模块

shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。 shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。

import shelve
 f = shelve.open('test1')
 f['key'] = {'a':1, 'b':2, 'c':'sss'} #直接对文件句柄操作,就可以存入数据
 f['key2'] = {'d':3, 'e':4, 'f':'ddd'}
 f.close()
 f1 = shelve.open('test1')
 dic1 = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
 dic2 = f1['key2']
 f1.close()
 print(dic1)
 print(dic2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python学习笔记(二)基础语法
Jun 06 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
python中正则表达式 re.findall 用法
Oct 23 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
Django 自动生成api接口文档教程
Nov 19 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
python 5个实用的技巧
Sep 27 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 #Python
python获取Linux发行版名称
Aug 30 #Python
python实现ip地址查询经纬度定位详解
Aug 30 #Python
Django 对IP访问频率进行限制的例子
Aug 30 #Python
关于Python3 类方法、静态方法新解
Aug 30 #Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 #Python
简单的Python调度器Schedule详解
Aug 30 #Python
You might like
如何过滤高亮显示非法字符
2006/10/09 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
js实现简单点赞操作
2020/03/17 Javascript
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python聊天室程序(基础版)
2018/04/01 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
土建专业毕业生自荐书
2014/07/04 职场文书
代理人委托书
2014/08/01 职场文书
卖车协议书范例
2014/09/16 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android