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 不同对象比较大小示例探讨
Aug 21 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
Python实现的堆排序算法示例
Apr 29 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
python读写文件write和flush的实现方式
Feb 21 Python
Python 如何批量更新已安装的库
May 26 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
python解释器安装教程的方法步骤
Jul 02 Python
详解Python yaml模块
Sep 23 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中遇到的时区问题解决方法
2015/07/23 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
js查错流程归纳
2012/05/04 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
Python devel安装失败问题解决方案
2020/06/09 Python
python中什么是面向对象
2020/06/11 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
广告学专业毕业生自荐信
2013/09/24 职场文书
工作自荐信
2013/12/11 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
2015教师年度考核评语
2015/03/25 职场文书
导游词之江南周庄
2019/12/06 职场文书