参考博客: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模块

>>> importjson>>> data = {"name":"kebi","age":25}>>> in_json =json.dumps(data)>>> type(in_json) #序列化:将一个字典转化为字符串

>>>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) #字典格式

除此之外,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) #返回的是列表

在进行数据格式转换的时候,数据的类型会略有改动。

>>> 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对象结构进行序列化和反序列化的二进制协议。

>>> importpickle>>>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协议来实现数据序列化。

>>> importshelve>>> f = shelve.open('shelve_file') #直接对文件句柄进行操作,就可以存入数据

>>> f['key'] = {'name': 'kebi', 'age': 25}>>>f.close()>>> importshelve>>> 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之数据的序列化相关推荐

  1. python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)

    一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...

  2. python查询数据库后更新_python 实现数据库中数据添加、查询与更新的示例代码...

    一.前言 最近做web网站的测试,遇到很多需要批量造数据的功能:比如某个页面展示数据条数需要达到10000条进行测试,此时手动构造数据肯定是不可能的,此时只能通过python脚本进行自动构造数据:本次 ...

  3. python制作数据库报表_如何制作数据报表并实现自动化?

    定期的数据报表,包括日报.周报.月报.半年报.年报,是每一位数据运营或数据分析师可能遇到的工作,需求方主要包括产品运营部门和各业务部门.基于不同公司的不同发展阶段,遇到的报表工作"层次&qu ...

  4. python修改数据库表结构_python中数据库的相关操作-pymysql

    python3中可以使用库pymysql 数据准备: 搭建一个数据库,我是在docker下搭建的Mysql(端口号是3306,账号是root,密码123456) 建立数据库test_db,表TB_St ...

  5. python建立数据库表格

    这个是在已经建立数据库的情况下,才可以使用该代码 #-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf- ...

  6. python建立数据库和基本表_python基础 — 链接 Mysql 创建 数据库和创表

    重点: 1. 链接服务器的数据库 2. 创建表和格式 3. 插入多行数据 import pymysql try: host='xxx' user='xxx' passwd='xxx' db='test ...

  7. python建立数据库连接时出错_python – 尝试连接到localhost上的数据库时出现pyodbc连接错误...

    我的机器上有一个名为"Test"的本地数据库,其中包含一个名为"Tags"的表.我能够通过SQL Server管理工作室2008从该表访问此数据库和查询. 但是 ...

  8. python连数据库课程设计_python 连接操作 各类数据库

    摘要: 用Python写脚本也有一段时间了,经常操作数据库(MySQL),现在就整理下对各类数据库的操作,如后面有新的参数会补进来,慢慢完善. 一,python 操作 MySQL:详情见:这里 mac ...

  9. python比较数据库表今天跟前一天数据增量,Python 生产环境Mysql数据库增量备份脚本...

    Mysql数据库常用的办法是通过mysqldump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题.前面写了一遍blog介绍xtrabackup的热备工具.下面的脚本是基于 ...

最新文章

  1. HTTP头信息中的参数Etag
  2. Android pms权限管理,Android权限机制
  3. 数据库架构的升级和变更
  4. optparse模块
  5. Android init.rc 服务启动不成功
  6. JavaScript-获得和设置表单的值
  7. [jzoj 5775]【NOIP2008模拟】农夫约的假期 (前缀和+递推)
  8. java sendredirect报错_java 中sendredirect()和forward()方法的区别
  9. SQL注入学习part07:(SQL注入语句总结)
  10. jpa 表注释和字段注释_JPA注释–Hibernate注释
  11. windows网络编程头文件注意事项
  12. 老化测试相关知识点介绍
  13. 机器人领域 期刊与会议
  14. 全网首发C++ OBS源码分析与屏幕录制软件开发视频教程
  15. Ubantu18.04上配置cuda10.0和cudnn
  16. 佛罗里达大学计算机工程专业,佛罗里达大学cs专业
  17. 如何合并视频?教你把多个视频合并成一个视频
  18. linux ati显卡驱动下载,教你在Linux中安装ATI显卡驱动(图)
  19. 2020总结:软件工程,由分析需求到立项到测试再到?
  20. linux系统深入学习

热门文章

  1. 优化项目中树结构数据的操作
  2. 小程序完整对接 pingpp支付
  3. Android Studio 小提示,新建Activity
  4. Java 动态代理实践AOP
  5. CF 277.5 B.BerSU Ball 二分图的最大匹配 模版题
  6. 【转载】SOA面向服务架构简述
  7. MSDN Webcast怎么看的
  8. HDFS NameNode进程挂了并且数据也丢失了,如何进行恢复?
  9. linux 获取CPU NUMA内存节点信息
  10. helm3 push/pull安装使用细节及添加国内仓库