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)? 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重 ...
随机推荐
- Camera2/HAL3
Android Camera HAL3中拍照Capture模式下多模块间的交互与帧Result与帧数据回调https://blog.csdn.net/gzzaigcnforever/article/d ...
- JQuery IN ACTION读书笔记之一: JQuery选择器
本章关注两个通过$()使用的常用功能: 通过选择器选择DOM元素,创建新DOM元素. 2.1 选择操作元素 JQuery采用了CSS的语法,而CSS的语法你可能已经很熟悉了.当然,JQuery也做了扩 ...
- ubuntu如何使用minicom
minicom是linux下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利,下面将讲解minicom的安装和配置. 一.安装mi ...
- 虚机下Ubuntu与Win7文件共享
使用Samba服务实现虚机与本机的文件共享,简单的分为以下几个步骤,按部就班,so easy 1.安装smb sudo apt-get install samba sudo apt-get insta ...
- C语言结构体指针的引用问题
在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...
- sublime和webstorm安装zencoding
[webstorm] 1.下载模板,地址为http://code.google.com/p/zen-coding/downloads/list,下载以下文件 WebIDE and IntelliJ I ...
- VMware虚拟机 Ubuntu 实用技巧 (1) -- 安装VMware Tool
1.用VM安装Ubuntu后屏幕太小? 2.Ubuntu中的文本与window中的文本不能互相复制黏贴? 如果你遇到以上问题,可以通过在VMware里安装“VMware Tool”插件解决!! 安装步 ...
- 使用Squid搭建HTTPS代理服务器
由于经常去的一些国外网站如Google.Blogspot.Wordpress被"出现了技术问题",访问不了,于是我在自己的DigitalOcean云主机上搭建了一个 Squid代理 ...
- 探讨电子商务新的商业模式O2O
在当前的市场经济大环境下,电子商务成为了众 多中小企业用以开拓市场的主要工具,成为突破企业管理瓶颈的重要手段.必卖电子商务顾问认为,电子商务应该是是线上业务与线下业务的结合.对于从线下渠道 起家的传统 ...
- Eclipse Debug 配置
创建和使用 Debug 配置 Eclipse Debug 配置类似于运行配置但它是用于在调试模式下开启应用. 打开 Debug 配置对话框步骤为:Run > Debug Configuratio ...