序列化模块
序列化——转向一个字符串数据类型
序列——字符串
用在数据存储以及在网络上传输的时候等
从数据类>>>字符串的过程 叫序列化
从字符串>>>数据类型的过程 叫反序列化
序列化格式
json 通用的序列化格式
json是一个在所有语言都通用的序列化格式,但是相对的它支持的数据类型就比较少了
只有很少的一部分数据类型能够通过json转化成字符串
在python中,数字int,字符串str,列表list,字典dict都是能序列化的
元组tuple也能序列化,不过它是转成列表再序列化的,反序列化后还是列表
集合set是不能进行序列化的
json的序列化方法dumps和反序列化方法loads
dumps
import json li = [1,2,3,'holle',[22,33],{'k1':'v1'},(23,3)] ret = json.dumps(li) print(type(ret),ret)
<class 'str'> [1, 2, 3, "holle", [22, 33], {"k1": "v1"}, [23, 3]]
loads
import json li = [1,2,3,'holle',[22,33],{'k1':'v1'},(23,3)] ret = json.dumps(li) print(type(ret),ret) ret2 = json.loads(ret) print(type(ret2),ret2)
<class 'str'> [1, 2, 3, "holle", [22, 33], {"k1": "v1"}, [23, 3]]
<class 'list'> [1, 2, 3, 'holle', [22, 33], {'k1': 'v1'}, [23, 3]]
除了这俩还有另外两个dump和load,这俩看着和上面俩只是差个s
它们的功能也是相似的,当然也有着不听之处
dump
import json li = {1:"a",2:'b'} f = open('file','w',encoding='utf-8') json.dump(li,f) f.close()
它的作用是在一个文件中写入序列化之后的字符串
load
import json li = {1:"a",2:'b'} f = open('file','w',encoding='utf-8') json.dump(li,f) f.close() f = open('file') res = json.load(f) f.close() print(type(res),res)
<class 'dict'> {'1': 'a', '2': 'b'}
对文件的读取,读取必须是用dump写入的
pickle
所有python中的数据类型都可以转化成字符串形式
pickle序列化的内容只有python能理解
pickle反序列化必须要与序列化时相同的环境支持
pickle的用法和json的一样
不过dumps写的是bytes类型的,所以读写要加上bytes类型的转换
shelve
序列化句柄
使用句柄直接操作,非常方便
import shelve f = shelve.open('shelve_file') f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} f.close() f1 = shelve.open('shelve_file') existing = f1['key'] f1.close() print(existing)
{'float': 9.5, 'int': 10, 'string': 'Sample data'}
直接对文件句柄操作,就可以存入数据
取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错