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中的Matplotlib模块入门教程
Apr 15 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
Keras loss函数剖析
Jul 06 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
python通过新建环境安装tfx的问题
May 20 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使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
js闭包的用途详解
2014/11/09 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
新农村建设标语
2014/06/24 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
庆祝教师节主持词
2015/07/06 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
python基础之模块的导入
2021/10/24 Python