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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
简单了解Python中的几种函数
Nov 03 Python
Python爬虫工程师面试问题总结
Mar 22 Python
python使用代理ip访问网站的实例
May 07 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
NumPy中的维度Axis详解
Nov 26 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
python接口自动化框架实战
Dec 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/10/10 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
javascript的函数作用域
2014/11/12 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
python如何制作缩略图
2019/04/30 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
HTML5标签大全
2016/11/23 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
2014两会优秀的心得体会范文
2014/03/17 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
经典导游欢迎词
2015/01/26 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
英文辞职信范文
2015/05/13 职场文书
python实现过滤敏感词
2021/05/08 Python
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
sql注入教程之类型以及提交注入
2021/08/02 MySQL