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装饰器实例大详解
Oct 25 Python
python3 判断列表是一个空列表的方法
May 04 Python
django 自定义过滤器的实现
Feb 26 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
python中for循环变量作用域及用法详解
Nov 05 Python
python 实现矩阵按对角线打印
Nov 29 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
python 命名规范知识点汇总
Feb 14 Python
python 爬取小说并下载的示例
Dec 07 Python
python如何查找列表中元素的位置
May 30 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的FTP学习(一)[转自奥索]
2006/10/09 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
php日历制作代码分享
2014/01/20 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
Python多进程编程技术实例分析
2014/09/16 Python
Python实现线程状态监测简单示例
2018/03/28 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python实现自动解数独小程序
2019/01/21 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
学习Django知识点分享
2019/09/11 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
婚礼答谢宴主持词
2014/03/14 职场文书
2015年司机工作总结
2015/04/23 职场文书
学校运动会简讯
2015/07/20 职场文书
推广普通话主题班会
2015/08/17 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
用golang如何替换某个文件中的字符串
2021/04/25 Golang
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang