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连接mssql数据库编码问题解决方法
Jan 01 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 Python
python将文本分每两行一组并保存到文件
Mar 19 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
使用celery执行Django串行异步任务的方法步骤
Jun 06 Python
python动态进度条的实现代码
Jul 03 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
python os.fork() 循环输出方法
Aug 08 Python
python SocketServer源码深入解读
Sep 17 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 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/11/16 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
python:print格式化输出到文件的实例
2018/05/14 Python
python实现windows下文件备份脚本
2018/05/27 Python
python 获取字符串MD5值方法
2018/05/29 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
经典团队口号大全
2014/06/21 职场文书
2014年优秀党员材料
2014/12/18 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
2019 入党申请书范文
2019/07/10 职场文书
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
python 标准库原理与用法详解之os.path篇
2021/10/24 Python