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编写暴力破解FTP密码小工具
Nov 19 Python
Python中处理时间的几种方法小结
Apr 09 Python
在Python中操作列表之List.pop()方法的使用
May 21 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
python中的句柄操作的方法示例
Jun 20 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
Python request使用方法及问题总结
Apr 26 Python
python对execl 处理操作代码
Jun 22 Python
pandas 数据类型转换的实现
Dec 29 Python
python中HTMLParser模块知识点总结
Jan 25 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 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 iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python SQLite3数据库操作类分享
2014/06/10 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python deque模块简单使用代码实例
2020/03/12 Python
django下创建多个app并设置urls方法
2020/08/02 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
营销专业应届生求职信
2013/11/26 职场文书
社区母亲节活动方案
2014/03/05 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js