1.概念¶
将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化;反之,则称为反序列化。
2.json模块¶
大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。
Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。
encoding: 把Python对象转换成JSON字符串
decoding: 把JSON字符串转换成python对象
import json d = {'name': 'tom', 'age': 20, 'interest': ['music', 'movie']} j = json.dumps(d) jOut[1]:
'{"name": "tom", "age": 20, "interest": ["music", "movie"]}'In [2]:
d1 = json.loads(j) d1Out[2]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
1)sort_keys参数: 表示序列化时是否对dict的key进行排序(dict默认是无序的)
In [3]:j1 = json.dumps(d, sort_keys=True) j1Out[3]:
'{"age": 20, "interest": ["music", "movie"], "name": "tom"}'
2)indent参数: 表示缩进的意思,它可以使得数据存储的格式变得更加优雅、可读性更强;如果indent是一个非负整数或字符串,则JSON array元素和object成员将会被以相应的缩进级别进行打印输出;如果indent是0或负数或空字符串,则将只会插入换行,不会有缩进。
In [4]:j2 = json.dumps(d, sort_keys=True, indent=4) j2Out[4]:
'{\n "age": 20,\n "interest": [\n "music",\n "movie"\n ],\n "name": "tom"\n}'In [5]:
# 序列化到文件中 with open('test.json', 'w') as fp: json.dump(d, fp, indent=4)In [6]:
# 反序列化文件中的内容 with open('test.json', 'r') as fp: d3 = json.load(fp) d3Out[6]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
3.pickle模块¶
pickle模块实现了用于对Python对象结构进行 序列化 和 反序列化 的二进制协议,与json模块不同的是pickle模块序列化和反序列化的过程分别叫做 pickling 和 unpickling:
pickling: 是将Python对象转换为字节流的过程;
unpickling: 是将字节流二进制文件或字节对象转换回Python对象的过程;
pickle模块与json模块对比:
1.JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),而pickle是一个二进制序列化格式;
2.JOSN是我们可以读懂的数据格式,而pickle是二进制格式,我们无法读懂;
3.JSON是与特定的编程语言或系统无关的,且它在Python生态系统之外被广泛使用,而pickle使用的数据格式是特定于Python的;
4.默认情况下,JSON只能表示Python内建数据类型,对于自定义数据类型需要一些额外的工作来完成;pickle可以直接表示大量的Python数据类型,包括自定数据类型(其中,许多是通过巧妙地使用Python内省功能自动实现的;复杂的情况可以通过实现specific object API来解决)
import pickle # pickle序列化 d = {'name': 'tom', 'age': 20, 'interest': ['music', 'movie']} p = pickle.dumps(d) pOut[9]:
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00tomq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x08\x00\x00\x00interestq\x04]q\x05(X\x05\x00\x00\x00musicq\x06X\x05\x00\x00\x00movieq\x07eu.'In [12]:
# pickle反序列化 d4 = pickle.loads(p) d4Out[12]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}In [13]:
# 持久化到文件 with open('pickle.txt', 'wb') as f: pickle.dump(d, f)In [14]:
# 从文件中读取数据 with open('pickle.txt', 'rb') as f: d5 = pickle.load(f) d5Out[14]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
4.实例:自定义数据类型的序列化/反序列化¶
首先来自定义一个数据类型:
In [15]:class Student(object): def __init__(self, name, age, sno): self.name = name self.age = age self.sno = sno def __repr__(self): return 'Student [name: %s, age: %d, sno: %d]' % (self.name, self.age, self.sno)
pickle模块可以直接对自定数据类型进行序列化/反序列化操作,无需编写额外的处理函数或类。
In [17]:stu = Student('Tom', 19, 1) stuOut[17]:
Student [name: Tom, age: 19, sno: 1]In [18]:
# 持久化到文件 with open('stu_pickle.txt', 'wb') as f: pickle.dump(stu, f)In [19]:
# 从文件中读取数据 with open('stu_pickle.txt', 'rb') as f: stu_pickle = pickle.load(f) stu_pickleOut[19]:
Student [name: Tom, age: 19, sno: 1]In [ ]: