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中from module import * 的一个坑
Jul 20 Python
Django卸载之后重新安装的方法
Mar 15 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python排序算法实例代码
Aug 10 Python
Python带动态参数功能的sqlite工具类
May 26 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
python编写微信公众号首图思路详解
Dec 13 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
教你利用python实现企业微信发送消息
May 23 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
php preg_replace替换实例讲解
2013/11/04 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
理解javascript模块化
2016/03/28 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
谈谈如何手动释放Python的内存
2016/12/17 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
浅谈django orm 优化
2018/08/18 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Python 读取位于包中的数据文件
2020/08/07 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
优秀生推荐信范文
2013/11/28 职场文书
企业文明单位申报材料
2014/05/16 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
个人思想政治总结
2015/03/05 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python