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脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
通过shell+python实现企业微信预警
Mar 07 Python
python pandas写入excel文件的方法示例
Jun 25 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
python使用scapy模块实现ARP扫描的过程
Jan 21 Python
Python+Appium新手教程
Apr 17 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 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/12/06 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
Python脚本实现集群检测和管理功能
2015/03/06 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
群胜软件Java笔试题
2012/09/29 面试题
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
事假请假条范文
2014/04/11 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书