70Python核心精要:json模块和pickle模块

Posted FinTech修行僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了70Python核心精要:json模块和pickle模块相关的知识,希望对你有一定的参考价值。

Python核心精要:json模块和pickle模块


Python用于序列化的两个模块:json模块和pickle模块


持久性

持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象。


持久性的思想

持久性的基本思想很简单。假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项)。换句话说,您希望将对象存储在磁盘上,便于以后检索。这就是持久性。


要达到这个目的,有几种方法,每一种方法都有其优缺点。


例如,可以将对象数据存储在某种格式的文本文件中,譬如 CSV 文件。或者可以用关系数据库,譬如 Gadfly、mysql、PostgreSQL 或者 DB2。这些文件格式和数据库都非常优秀,对于所有这些存储机制,Python 都有健壮的接口。


这些存储机制都有一个共同点:存储的数据是独立于对这些数据进行操作的对象和程序


这样做的好处是,数据可以作为共享的资源,供其它应用程序使用。缺点是,用这种方式,可以允许其它程序访问对象的数据,这违背了面向对象的封装性原则 — 即对象的数据只能通过这个对象自身的公共(public)接口来访问。


另外,对于某些应用程序,关系数据库方法可能不是很理想。尤其是,关系数据库不理解对象。相反,关系数据库会强行使用自己的类型系统和关系数据模型(表),每张表包含一组元组(行),每行包含具有固定数目的静态类型字段(列)。如果应用程序的对象模型不能够方便地转换到关系模型,那么在将对象映射到元组以及将元组映射回对象方面,会碰到一定难度。这种困难常被称为阻碍性不匹配(impedence-mismatch)问题。


对象持久性

如果希望透明地存储 Python 对象,而不丢失其身份和类型等信息,则需要某种形式的对象序列化:它是一个将任意复杂的对象转成对象的文本或二进制表示的过程同样,必须能够将对象经过序列化后的形式恢复到原有的对象。


在 Python 中,这种序列化过程称为 pickle可以将对象 pickle 成字符串、磁盘上的文件或者任何类似于文件的对象,也可以将这些字符串、文件或任何类似于文件的对象 unpickle 成原来的对象。


序列化(Serialization)

将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等。


反序列化

就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。


JSON(Java Script Object Notation)

一种轻量级数据交互格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是javascript中的一个子集。


python的json模块序列化与反序列化的过程分别是encoding和  decoding:

  • encoding:把一个python对象编码转换成Json字符串;

  • decoding:把json格式字符串解码转换成python对象;


【70】Python核心精要:json模块和pickle模块

json模块


json用于【字符串】和 【python基本数据类型】 间进行转换

json提供四个功能:dumps, dump, loads, load


(1)json.dumps(data)功能

将python对象通过特殊的形式转换为所有程序语言都认识的字符串,即json

【70】Python核心精要:json模块和pickle模块


(2)json.dump(data,f)功能

将python对象通过特殊的形式转换为所有程序语言都认识的字符串,即json,并写入文件,其中 f 是打开的文件对象

【70】Python核心精要:json模块和pickle模块


(3)json.loads(data)功能

将json编码的字符串再转换为python的数据对象

【70】Python核心精要:json模块和pickle模块


(4)json.load(f)功能

从数据文件中读取数据,并将json编码的字符串转换为python的数据对象

【70】Python核心精要:json模块和pickle模块



json编码支持的基本类型有:None, bool, int, float, string, list, tuple, dict


对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。


json编码的格式几乎和python语法一致,略有不同的是:True会被映射为true,False会被映射为false,None会被映射为null,元组()会被映射为列表[],因为其他语言没有元组的概念,只有数组,也就是列表。


python 原始类型向 json 类型的转化对照表:

【70】Python核心精要:json模块和pickle模块


json 类型转换到 python 的类型对照表:

【70】Python核心精要:json模块和pickle模块


【70】Python核心精要:json模块和pickle模块

pickle模块


pickle用于【python特有的类型】和【python的数据类型】间进行转换


pickle提供四个功能:dumps,dump,loads,load


(1)pickle.dumps(data) 

将数据通过特殊的形式转换为只有python语言认识的字符串

【70】Python核心精要:json模块和pickle模块


(2)pickle.dump(data,f) 

将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件

【70】Python核心精要:json模块和pickle模块

注意,这里用open函数时,其写入方式必须为wb,否则会报错。


(3)pickle.loads(data)  

pickle数据转换为python的数据结构

【70】Python核心精要:json模块和pickle模块


(4)pickle.load(f) 

从数据文件中读取数据,并转换为python的数据结构

注意,这里用open函数时,读取方式必须为rb,否则会报错。



pickle可以存储什么类型的数据呢?

  • 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。

  • 由任何原生类型组成的列表,元组,字典和集合。

  • 函数,类,类的实例


pickle的使用方式和json基本一样。




参考文献

【1】http://www.runoob.com/python/python-json.html

【2】http://www.cnblogs.com/wang-yc/p/5616187.html

【3】http://www.cnblogs.com/wang-yc/p/5616579.html

【4】http://www.cnblogs.com/cobbliu/archive/2012/09/04/2670178.html

以上是关于70Python核心精要:json模块和pickle模块的主要内容,如果未能解决你的问题,请参考以下文章

Python json和pickle模块

python模块(json和pickle模块)

Python序列化模块pickle和json使用和区别

python --- json模块和pickle模块详解

python 序列化模块之 json 和 pickle

python--json & pickle 模块