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)? 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重 ...
随机推荐
- 基于注解的Mybatis mapper 接口注意事项
基于注解的Mybatis mapper 接口功能没有mapper xml配置文件丰富,并且动态sql语句的灵活性不能和xml配置相比. 这里仅仅说一下基于注解的动态sql注意事项: Mybatis提供 ...
- iOS多线程(转)
关于iOS多线程,你看我就够了 字数8596 阅读28558 评论74 喜欢313 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例 ...
- Java8 stream学习
Java8初体验(二)Stream语法详解 Java 8 flatMap示例 第一个Stream Demo IDEA里面写Stream有个坑 虽然java文件中没错,但是但编译的时候还是报错了, In ...
- linux上安装python3同时保留python2
linux上安装python3同时保留python2?这个就要用到上篇说到的path变量了. 具体介绍及操作 这里我下载python3.6版本来进行介绍 django默认数据库为sqlite3,所以安 ...
- shiro session过期后ajax请求跳转(转)
配置了 Shrio框架,session也集成进去了 ,发现问题session会话过期,点击页面,一直请求失败.本来想集成拦截器,过滤器,但是已经用了shiro框架,sessionDestroyed 方 ...
- node.js 入门
什么是Node.js?还服务器端javascript?对于这个概念我在这篇文章不做解释,可以自己去搜索了解下,服务器端js不是新技术,只是最近的node.js的火爆让他爆发了,我会在以后的文章里解释什 ...
- C++中计算矩阵的行列式
使用eigen库: 求行列式: #include <iostream> #include <Eigen/Dense> using namespace std; using na ...
- PYTHON -创建 表 和 插入 数据
import sqlite3 conn = sqlite3.connect('y_user_data2.db') cursor = conn.cursor() #create tablecursor. ...
- SQL Server 服务无法启动,错误1069解决办法
刚刚接到公司服务器上的SQL Server服务无法启动的问题需要解决,在进入“SQL Server 配置管理器”启动MSSQLServer 服务时,启动过程异常缓慢预示着“异常”的存在.果然,系统给出 ...
- ie10 css hack 条件注释等兼容方式整理
点评:ie10已经上线一段时间了,相信已经有一部分前端潮人体验过了,截至到现在,在ie6到ie9的浏览器各种各样的古怪行为,开发人员不得不使用条件注释,有条件的类,和其他特定于IE的css hack来 ...