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装饰器 免去调用父类构造函数的麻烦
May 18 Python
python通过yield实现数组全排列的方法
Mar 18 Python
python对DICOM图像的读取方法详解
Jul 17 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
python代码实现ID3决策树算法
Dec 20 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
详解torch.Tensor的4种乘法
Sep 03 Python
Python为何不支持switch语句原理详解
Oct 21 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
python 使用pandas读取csv文件的方法
Dec 24 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技巧与注意事项分析
2011/02/03 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
offsetParent 算法分析
2010/04/05 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
js中的this关键字详解
2013/09/25 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
进一步探究Python中的正则表达式
2015/04/28 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python人脸识别初探
2017/12/21 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
什么是规则表达式
2012/05/03 面试题
产品质量承诺书范文
2014/03/27 职场文书
领导参观欢迎词
2015/01/26 职场文书
法人身份证明书
2015/06/18 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS