什么是序列化?
序列化就是把内存里的数据类型转成字符串,以使其能够存储到硬盘中或在网络中传输到远程,因为硬盘和网络传输时只接收bytes
用于序列化的两个模块
1. json,用于字符串和python数据类型间的转换
2. pickle,用于python特有的数据类型和python数据类型间进行转换
json模块提供了4个功能:dumps、dump、loads、load 可以跨平台
pickle模块提供了4个功能:dumps、dump、loads、load 只能在python中使用
json用法
import json
data = { 'role': 'Alex', 'life': 50 } # json序列化 json_str = json.dumps(data) print(json_str,type(json_str)) # 输出 # {"role": "Alex", "life": 50} <class 'str'> # json反序列化 data = json.loads(json_str) print(data,type(data)) # 输出 # {'role': 'Alex', 'life': 50} <class 'dict'>
配合文件操作的json用法
# 序列化配合文件操作 with open('./tmp/json.pk','w') as fp: json.dump(data,fp) # 反序列化配合文件操作 with open('tmp/json.pk') as fp: data = json.load(fp) print(data,type(data)) # 输出 # {'life': 50, 'role': 'Alex'} <class 'dict'>
pickle用法
import pickle # pickle序列化 pickle_str = pickle.dumps(data) print(pickle_str,type(pickle_str)) # 输出 # b'\x80\x03}q\x00(X\x04\x00\x00\x00lifeq\x01K2X\x04\x00\x00\x00roleq\x02X\x04\x00\x00\x00Alexq\x03u.' <class 'bytes'> # pickle反序列化 data = pickle.loads(pickle_str) print(data,type(data)) # 输出 # {'life': 50, 'role': 'Alex'} <class 'dict'>
结合文件操作
# 结合文件操作的pickle序列化 with open('tmp/pickle.pk','wb') as fp: pickle.dump(data,fp) # 结合文件操作的pickle反序列化 with open('tmp/pickle.pk','rb') as fp: data = pickle.load(fp) print(data,type(data))
注意:pickle序列化后不是字符串,而是字节,所以在文件操作的时候,需要注意要使用 'wb' 和 'rb'
shelve用法
import shelve
name = ['alex','sex','test'] info = {'life': 45,'age':28}
# 序列化 s = shelve.open('tmp/shelve') s['name'] = name s['info'] = info s.close() # 反序列化 s = shelve.open('tmp/shelve') name = s['name'] info = s['info'] print('name:',name,'info:',info) s.close() # 输出 # name: ['alex', 'sex', 'test'] info: {'age': 28, 'life': 45}