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操作gmail实例
Jan 14 Python
Python返回真假值(True or False)小技巧
Apr 10 Python
python抓取网页中图片并保存到本地
Dec 01 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
python 每天如何定时启动爬虫任务(实现方法分享)
May 21 Python
python如何创建TCP服务端和客户端
Aug 26 Python
python实现简单http服务器功能
Sep 17 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
python第三方库学习笔记
Feb 07 Python
django教程如何自学
Jul 31 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 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/10/09 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
javascript动画效果类封装代码
2007/08/28 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
js css自定义分页效果
2017/02/24 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python冒泡排序简单实现方法
2015/07/09 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
如何清空Session
2015/02/23 面试题
外企财务年会演讲稿
2014/01/03 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
教师见习报告范文
2014/11/03 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle