前言
序列化?TCP/IP协议只支持字节数组的传输,不能直接传我们平时用到的一组数据对象。对象序列化的结果一定是字节数组!
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。所以在Python中就有丰富的序列化模块。
一、json 序列化模块
json是一种轻量级的数据交换格式,就好像中国地方语言有很多,你可能听不懂,但是只要我们都懂得中文国语那一定能一起沟通了。
- 通用的序列化格式,平时也是常见的一种数据结构;
- python中只有部分数据类型能够进行序列化转换成字符串;
1.dumps序列化 和 loads反序列化:
# 1.dumps序列化 和 loads反序列化 import json dic = {'k': 'v'} print(dic, '序列化前的类型:', type(dic)) ret_str = json.dumps(dic) print(ret_str, '序列化后的类型:', type(ret_str)) ret_dic = json.loads(ret_str) print(ret_dic, '反序列化后:', type(ret_dic)) # 序列化的类型有:str、int、list、dict、tuple
2、dump 和 load 对一个对象进行序列化和反序列化
# 2、dump 和 load 对一个对象进行序列化和反序列化 import json dic = {'k': '中国'} with open('fff', 'w', encoding='utf-8')as f: json.dump(dic, f, ensure_ascii=False) with open('fff', encoding='utf-8')as f: print(json.load(f))
如果不设置 ensure_ascii=False ,我们的fff文件将以Unicode编码写入:{"k": "u4e2du56fd"}
3、使用 dumps 换行写入文件 loads 一行一行读:
# 3、使用 dumps 换行写入文件: import json dic = [{'k1': 1}, {'k2': 2}, {'k3': 3}] f = open('test', 'w') for i in dic: str_dic = json.dumps(i) print(type(str_dic), str_dic) f.write(str_dic+' ') f.close() # loads 一行一行读 lis = [] f = open('test') for i in f: dic = json.loads(i) print(type(dic), dic) lis.append(dic) print(lis)
二、pickle 序列化模块
1、和json拥有的方法相同。
- Python中的所有数据类型都支持,与文件需要加b,如rb、wb
- 支持分次dumps和loads
dumps和loads:
# 什么数据类型都可以,与文件需要加b,如rb、wb # 支持分次dumps和loads # dumps和loads: import pickle dic = [{'k1': 1}, {'k2': 2}, {'k3': 3}] str_dic = pickle.dumps(dic) print(str_dic) dic1 = pickle.loads(str_dic) print(dic1)
三、shelve 序列化模块
1、只提供一个open方法,序列化句柄
2、使用句柄操作,非常方便
import shelve f = shelve.open('test') f['k'] = {'k': '广深小龙'} f.close() f1 = shelve.open('test', writeback=True) # writeback=True会记录所操作的增删改 dic = f1['k'] print(type(dic), dic) f1.close()
shelve就好像在Python中操作dict数据类型一样,shelve序列化会生成三个文件:
等等还有其他如:messagepack
欢迎来大家QQ交流群一起学习:482713805