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 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Pandas中resample方法详解
Jul 02 Python
Python画图高斯分布的示例
Jul 10 Python
通过python检测字符串的字母
Feb 18 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
Keras中 ImageDataGenerator函数的参数用法
Jul 03 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
python绘制汉诺塔
Mar 01 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 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类的使用 实例代码讲解
2009/12/28 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
JS获取时间的方法
2015/01/21 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
Python实现的简单模板引擎功能示例
2017/09/02 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
python中安装django模块的方法
2020/03/12 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
详解python polyscope库的安装和例程
2020/11/13 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
学校卫生检查制度
2014/02/03 职场文书
如何写早恋检讨书
2014/09/10 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
小学语文复习计划
2015/01/19 职场文书
安装工程师岗位职责
2015/02/13 职场文书
清明节主题班会
2015/08/14 职场文书
PHP控制循环操作的时间
2021/04/01 PHP
Python办公自动化之Excel(中)
2021/05/24 Python
python实现Nao机器人的单目测距
2021/09/04 Python
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis