序列化介绍
序列化指的是把内存的数据类型转换成一个特定的格式的内容, 该格式的内容可用于存储或者传输给其他的平台使用。
序列化的两种用途:
1. 持久保存状态: 将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
2. 跨平台数据交互: 不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。
json模块详解
序列化
序列化采用的主要是json模块的dumps()方法以及dump()方法
import json # 序列化 json_res = json.dumps([1, 'aaa', True, False]) print(json_res, type(json_res)) # "[1, "aaa", true, false]" # 序列化的结果写入文件 with open('test.json', 'w', encoding='utf-8') as f: json.dump([1, 'aaa', True, False], f)
反序列化
反序列化采用的主要是json模块的loads()方法以及load()方法
import json # 反序列化 l = json.loads(json_res) print(l, type(l)) # 从文件读取json格式字符串进行反序列化操作: with open('test.json', 'r', encoding='utf-8') as f: l = json.load(f) print(l, type(l))
pickle模块详解
json模块和pickle模块都有 dumps、dump、loads、load四种方法,而且用法一样。
不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,
而pickle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码
不过pickle可以序列化函数,但是其他文件想用该函数,在该文件中需要有该文件的定义(定义和参数必须相同,内容可以不同)
import pickle res = pickle.dumps({1, 2, 3, 4, 5}) print(res, type(res)) s = pickle.loads(res) print(s, type(s))
shelve模块
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型
import shelve f=shelve.open(r'sheve.txt') # f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']} # f['stu2_info']={'name':'gangdan','age':53} # f['school_info']={'website':'http://www.pypy.org','city':'beijing'} print(f['stu1_info']['hobby']) f.close()