• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > 详解Python之数据序列化(json、pickle、shelve)

详解Python之数据序列化(json、pickle、shelve)

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了python pickle,python pickle模块,python pickle.dump,python3 pickle,python中pickle等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、前言

1. 现实需求

每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样。很多时候我们会有这样的需求:

  1. 把内存中的各种数据类型的数据通过网络传送给其它机器或客户端;
  2. 把内存中的各种数据类型的数据保存到本地磁盘持久化;

2.数据格式

如果要将一个系统内的数据通过网络传输给其它系统或客户端,我们通常都需要先把这些数据转化为字符串或字节串,而且需要规定一种统一的数据格式才能让数据接收端正确解析并理解这些数据的含义。XML 是早期被广泛使用的数据交换格式,在早期的系统集成论文中经常可以看到它的身影;如今大家使用更多的数据交换格式是JSON(JavaScript Object Notation),它是一种轻量级的数据交换格式。JSON相对于XML而言,更加加单、易于阅读和编写,同时也易于机器解析和生成。除此之外,我们也可以自定义内部使用的数据交换格式。

如果是想把数据持久化到本地磁盘,这部分数据通常只是供系统内部使用,因此数据转换协议以及转换后的数据格式也就不要求是标准、统一的,只要本系统内部能够正确识别即可。但是,系统内部的转换协议通常会随着编程语言版本的升级而发生变化(改进算法、提高效率),因此通常会涉及转换协议与编程语言的版本兼容问题,下面要时候的pickle协议就是这样一个例子。

3. 序列化/反序列化

将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化;反之,则称为反序列化。

4.相关模块

本节要介绍的就是Python内置的几个用于进行数据序列化的模块:

模块名称 描述 提供的api
json 用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load()
pickle 用于实现Python数据类型与Python特定二进制格式之间的转换 dumps()、dump()、loads()、load()
shelve 专门用于将Python数据类型的持久化到磁盘,shelf是一个类似dict的对象,操作十分便捷 open()

二、json模块

大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。

1. 序列化与反序列化

Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。

  1. encoding: 把Python对象转换成JSON字符串
  2. decoding: 把JSON字符串转换成python对象

json模块提供了以下两个方法来进行序列化和反序列化操作:

# 序列化:将Python对象转换成json字符串
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

# 反序列化:将json字符串转换成Python对象
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

</div>

除此之外,json模块还提供了两个额外的方法允许我们直接将序列化后得到的json数据保存到文件中,以及直接读取文件中的json数据进行反序列化操作:

# 序列化:将Python对象转换成json字符串并存储到文件中
dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

# 反序列化:读取指定文件中的json字符串并转换成Python对象
load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

</div>

2. JSON与Python之间数据类型对应关系

Python转JSON

Python JSON
dict Object
list, tuple array
str string
int, float, int- & float-derived Enums numbers
True true
False false
None null

JSON转Python

JSON Python
object dict
array list
string str
number(int) int
number(real) float
true True
false False
null None

说明:

  1. Python dict中的非字符串key被转换成JSON字符串时都会被转换为小写字符串;
  2. Python中的tuple,在序列化时会被转换为array,但是反序列化时,array会被转化为list;
  3. 由以上两点可知,当Python对象中包含tuple数据或者包含dict,且dict中存在非字符串的key时,反序列化后得到的结果与原来的Python对象是不一致的;
  4. 对于Python内置的数据类型(如:str, unicode, int, float, bool, None, list, tuple, dict)json模块可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。

3. 实例:内置数据类型序列化/反序列化

序列化

# 序列化
>>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)})
'{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}'
</div>

sort_keys参数: 表示序列化时是否对dict的key进行排序(dict默认是无序的)

# 序列化并对key进行排序
>>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, sort_keys=True)
'{"a": "str", "b": 11.1, "c": true, "d": null, "e": 10, "f": [1, 2, 3], "g": [4, 5, 6]}'
</div>

indent参数: 表示缩进的意思,它可以使得数据存储的格式变得更加优雅、可读性更强;如果indent是一个非负整数或字符串,则JSON array元素和object成员将会被以相应的缩进级别进行打印输出;如果indent是0或负数或空字符串,则将只会插入换行,不会有缩进。

# 序列化并对key进行排序及格式化输出
>>> print(json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, sort_keys=True, indent=4)) 
{
 "a": "str", 
 "b": 11.1, 
 "c": true, 
 "d": null, 
 "e": 10, 
 "f": [
  1, 
  2, 
  3
 ], 
 "g": [
  4, 
  5, 
  6
 ]
}
</div>

separators参数: 尽管indent参数可以使得数据存储的格式变得更加优雅、可读性更强,但是那是通过添加一些冗余的空白字符进行填充的。当json被用于网络数据通信时,应该尽可能的减少无用的数据传输,这样可以节省贷款并加快数据传输速度。json模块序列化Python对象后得到的json字符串中的','号和':'号分隔符后默认都会附加一个空白字符,我们可以通过separators参数重新指定分隔符,从而去除无用的空白字符;

  1. 该参数的值应该是一个tuple(item_se

您可能想查找下面的文章:

  • 用pickle存储Python的原生对象方法
  • 详解Python之数据序列化(json、pickle、shelve)
  • Python中的数据对象持久化存储模块pickle的使用示例
  • Python pickle模块用法实例分析
  • Python pickle模块用法实例分析
  • Python pickle模块用法实例
  • python持久性管理pickle模块详细介绍
  • Python pickle类库介绍(对象序列化和反序列化)
  • Python 序列化 pickle/cPickle模块使用介绍
  • Python pickle类库介绍(对象序列化和反序列化)

相关文章

  • python操作mysql中文显示乱码的解决方法
  • python同时给两个收件人发送邮件的方法
  • python 获取et和excel的版本号
  • 在Python的Flask框架下使用sqlalchemy库的简单教程
  • 简单介绍Python的轻便web框架Bottle
  • 让python同时兼容python2和python3的8个技巧分享
  • Python使用turtule画五角星的方法
  • Python实现简单状态框架的方法
  • Python实现新浪博客备份的方法
  • Python随机生成带特殊字符的密码

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • python 多线程实现检测服务器在线情况
    • Python最基本的数据类型以及对元组的介绍
    • 简单实现python爬虫功能
    • 详解Python函数作用域的LEGB顺序
    • 使用Python获取Linux系统的各种信息
    • Python函数中的函数(闭包)用法实例
    • python字典基本操作实例分析
    • 研究Python的ORM框架中的SQLAlchemy库的映射关系
    • Python 爬虫的工具列表大全
    • Python的字典和列表的使用中一些需要注意的地方

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有