python之数据的序列化
参考博客:http://www.cnblogs.com/yyds/p/6563608.html
| json.dumps() | 将python数据类型转换为(json)字符串 | 
| json.loads() | 将json字符串转化为python数据类型 | 
| json.dump() | 将python数据类型以json形式保存在本地磁盘 | 
| json.load() | 将本地磁盘中的json数据转化为python数据类型 | 
| pickle.dumps() | 将python数据类型转化为python特定的二进制格式 | 
| pickle.loads() | 将特定的二进制格式转化为python数据类型 | 
| pickle.dump() | 将python数据类型以特定的二进制格式保存到磁盘 | 
| pickle.load() | 将本地磁盘中python特定的二进制格式数据转化为python数据类型 | 
| shelve.open() | 以类型dict的形式将python数据类型保存到本地磁盘或读取本地磁盘数据并转化为python数据类型 | 
一、序列化概论
每种编程语言都有各自的的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),python也是一样。
很多时候,我们需要把各种数据类型的数据通过网络传送给其它机器或客户端,或者想把内层中的各种数据类型的数据保存到本地磁盘持久化。
而我们知道文件中存储的都是字符串,因此就需要格式的转化。
如果要将一个系统内的数据通过网络传输给其它系统或客户端,
我们通常都需要先把这些数据转化为字符串或字节串,
而且需要规定一种统一的数据格式才能让数据接收端正确解析并理解这些数据的含义。
XML是早期被广泛使用的数据交换格式,而如今大家使用更多的数据交换格式是JSON(JavaScript Object Notation),
它是一种轻量级的数据交换格式。JSON相对于XML而言,更加简单、易于阅读和编写,同时也易于机器解析和生成。
如果想把数据持久化到本地磁盘,这部分数据通常只是供系统内部使用,
因此数据转换协议以及转换后的数据格式也就不要求是标准、统一的,只要本系统内部能够正确识别即可。
将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式的过程称为序列化;反之,则称为反序列化。
在python中有几个内置的用于数据序列化的模块。
| 模块名称 | 描述 | 提供的api | 
| json | 用于实现python数据类型与通用(json)字符串之间的转换 | dumps()、dump()、loads()、load() | 
| pickle | 用于实现python数据类型与python特定二进制格式之间的转换 | dumps()、loads() | 
| shelve | 专门用于将python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象。 | open() | 
二、json模块
>>> import json
>>> data = {"name":"kebi","age":25}
>>> in_json = json.dumps(data)
>>> type(in_json) #序列化:将一个字典转化为字符串
<class 'str'>
>>> in_json
'{"name": "kebi", "age": 25}' >>> json.loads(in_json)
{'name': 'kebi', 'age': 25}
>>> out_json = json.loads(in_json) #反序列化:将一个字符串格式的字典转化为字符串
>>> out_json
{'name': 'kebi', 'age': 25}
>>> type(out_json)
<class 'dict'> #字典格式
除此之外,json模块还提供了两个额外的方法允许我们直接将序列化后得到的json数据保存到文件中,以及直接读取文件中的json数据进行反序列化操作。
>>> f = open('json_file','w')
>>> data
{'name': 'kebi', 'age': 25}
>>> json.dump(data,f)  #dump方法接受一个文件句柄,直接将字典转化为json字符串写入文件
>>> f.close()
[root@7 tmp]# cat json_file
{"name": "kebi", "age": 25} #已经写入
>>> f = open('json_file')
>>> data2 = json.load(f) #load方法接受一个文件句柄,直接将文件中的json字符串转化成数据结构返回。
>>> data2
{'name': 'kebi', 'age': 25}
>>> type(data2)
<class 'dict'>    #返回的是列表
在进行数据格式转换的时候,数据的类型会略有改动。
>>> 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, "e": 10, "b": 11.1, "d": null, "f": [1, 2, 3], "g": [4, 5, 6]}'
由上可知,True变成true,列表和元祖都变成序列,None变为null等
>>> json.loads('{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}')
{'c': True, 'e': 10, 'a': 'str', 'g': [4, 5, 6], 'd': None, 'f': [1, 2, 3], 'b': 11.1}
在反序列化的时候部分又会变回来。
三、pickle模块
pickle模块实现了用于对python对象结构进行序列化和反序列化的二进制协议。
>>> import pickle
>>> data
{'name': 'kebi', 'age': 25}
>>> str_data = pickle.dumps(data)
>>> str_data
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00kebiq\x02X\x03\x00\x00\x00ageq\x03K\x19u.' >>> data3 = pickle.loads(str_data)
>>> data3
{'name': 'kebi', 'age': 25}
pickle模块和json模块对比:
(1)JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),而pickle是一个二进制序列化格式。json我们能够读懂,而pickle不行。
(2) JSON是与特定的编程语言无关,且它在python之外被广泛使用,而pickle使用的数据格式是特定于python的。
(3)默认情况下,JSON只能表示python内建数据类型,pickle可以直接表示大量的python数据类型。
四、shelve模块
shelve是一个简单的数据存储方案,类似于key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。
>>> import shelve
>>> f = shelve.open('shelve_file') #直接对文件句柄进行操作,就可以存入数据
>>> f['key'] = {'name': 'kebi', 'age': 25}
>>> f.close() >>> import shelve
>>> f1 = shelve.open('shelve_file') #取出数据的时候也只需直接用key获取即可,但是如果key不存在就会报错。
>>> existing = f1['key']
>>> f1.close()
>>> existing
{'name': 'kebi', 'age': 25}
总结:
(1)各自优缺点
json模块常用于编写web接口,将python数据转化为通用的json格式传递给其它系统或客户端;
也可以用于将python数据保存到本地文件中,缺点是明文保存,保密性差。
pickle模块和shelve模块由于使用其特有的序列化协议,其序列化之后的数据只能被python识别,因此只能用于系统内部。
同时python2和python3默认使用的序列协议也不同,需要兼容的话还需要指定协议的版本。
pickle模块和shelve模块相对于json来说,对于自定义数据类型可以直接序列化和反序列化,不需要编写额外的转换函数或类。
shelve模块可以看作是pickle模块的升级版,因为shelve使用的就是pickle的序列化协议,
但是shelve比pickle提供的操作方式更加简单、方便。
shelve模块相对于其它两个模块在将python数据持久化到本地磁盘时有一个很明显的优点就是,
它允许我们可以像操作dict一样操作被序列化的数据,而不必一次性的保存或读取所有的数据。
(2)适用场景
在与外部系统交接互用时用json模块。
需要将少量、简单python数据持久化到本地磁盘文件时可以考虑用pickle模块。
需要将大量python数据化持久到本地磁盘文件或需要一些简单的类似数据库的增删改查功能时,可以考虑用shelve模块。
python之数据的序列化的更多相关文章
- Python 中数据的序列化和反序列化(json处理)
		
概念: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming ...
 - Python之数据序列化(json、pickle、shelve)
		
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
 - python全栈开发-json和pickle模块(数据的序列化)
		
一.什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat ...
 - python pickle模块的使用/将python数据对象序列化保存到文件中
		
# Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...
 - 【转】Python之数据序列化(json、pickle、shelve)
		
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
 - Python:time模块&序列化&生成随机数&反射
		
time模块:>>> import time >>> time.time <built-in function time> >>> t ...
 - Python学习之json序列化
		
一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...
 - python储存数据的方式
		
python储存数据的方式2017年10月13日 23:38:10 Nick_Spider 阅读数:59286 标签: redis 数据库 爬虫 存储 结构 更多 个人分类: 数据库 爬虫 pytho ...
 - python基础之模块 序列化
		
什么是序列化(picking)? 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重 ...
 
随机推荐
- 蓝桥杯 如何计算 X^X = 10  来求X呢?
			
题目中有说道:X的取值范围大于2小于3 高数书上中方程的近似解有讲到到:(同济第六版180页) ln(x^x)- ln(10)=0; x*ln(x) -ln(10)=0; 假设:F(x) = X*l ...
 - eclipse: Program "g++" not found in PATH
			
gdb命令行调试虽然还行,但是确实不如图形界面的直观...个人还是不习惯,就开始鼓捣eclipse的c/c++IDE(VS2013安装需要IE10,蛋疼,懒得弄) Build一个C工程的时候报错.我安 ...
 - libubox组件(3)——uloop
			
一:uloop概述 uloop有三个功能: 文件描述符触发事件的监控, timeout定时器处理, 当前进程的子进程的维护 二: uloop的整体框架 1: /** 2: * 初始化事件循环 3: ...
 - Time Limit Exceeded 求逆序对数。
			
/** 题目:Time Limit Exceeded 链接:https://oj.ejq.me/problem/28 题意:求逆序对数. 思路:树状数组求逆序对数.维护前面有多少个<=当前数的数 ...
 - ijkplayer框架深入剖析
			
随着互联网技术的飞速发展,移动端播放视频的需求如日中天,由此也催生了一批开源/闭源的播放器,但是无论这个播放器功能是否强大.兼容性是否优秀,它的基本模块通常都是由以下部分组成:事务处理.数据的接收和解 ...
 - Linux Linux程序练习一
			
注意:在Linux中,"*"是一个通配符,代表所有字符,所以"*"必须要使用转义字符"\"
 - jq中prop和attr的区别以及各自的使用
			
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...
 - 在DLL中动态加载其所依赖的dll
			
windows下LoadLibrary函数的搜索顺序是先搜索system32等系统环境变量path下注册过的路径,然后是当前路径. 这里的相对路径是指的主exe所在路径,并且相对路径在程序运行过程中可 ...
 - UVA 10319 - Manhattan(2-SET)
			
UVA 10319 - Manhattan 题目链接 题意:一个城市,有南北和东西街道.每种街道都是单行道,如今给定几个起点和终点.要求起点和终点必须最多转一次弯能够到达,问能否够满足全部的起点终点 ...
 - css单行排版
			
text-overflow: ellipsis; overflow: hidden; white-space: nowrap;