Python 序列化与反序列化
很多程序都需要用户输入某种信息,如让用户存储游戏首页项或者提供可视化的数据。不管是专注什么,程序员都会把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息:一种简单的方式就是使用.json来存储数据。
json模块让你能够将简单的python数据结构转存到文件中,并在程序再次运行时加载该文件中的数据。
你还可以使用json在python程序之间分享数据。
更为重要的是,Json数据格式并非python专用,这让你能够将json格式存储的数据与使用其他编程语言的人分享,或其他编程语言调用。
Json:(JavaScript Object Notation)格式最初是为javascript开发的,但后来成了一种常见的格式,包括python在内的众多语言采纳。
1. 使用json.dump()和json.load()
#Author:Anliu import json number = [2,3,4,5,67,8,9] filename = "numbers.json" with open("filename","w") as f_obj: json.dump(number,f_obj)
我们看存到文件的数据表格式和我们在python中的是一样的。
[2, 3, 4, 5, 67, 8, 9]
在编写下一个程序。使用json.load()将这个列表读取到内存中。
#Author:Anliu import json filename = "numbers.json" with open("filename","r") as f_obj: numbers = json.load(f_obj) print(numbers)
同样可以读取到列表。这样在程序之间实现了数据共享。
2. 序列化和反序列化的定义
- 序列化:就是把不可传输的对象转换为可存储或可传输的过程
- 反序列化:就是把在磁盘,等介质中的数据转换为对象
python中序列化通常有两种方式:pickle模块和json模块
2.1 pickle模块的使用
对于大多数应用程序来讲,dump()和load()函数的使用就是你使用pickle模块所需的全部了。
dumps(object)和dump(object) :序列化
loads(bytes)和load(bytes):反序列化
两者不同的是不带s的是(反)序列化关于二进制文件中,带s是(反)关于序列化对象
#Author:Anliu import pickle dict = {"hostname":"zabbix", "IP":"192.168.42.111" } print(dict,type(dict)) #with open("file_p","wb") as f: m = pickle.dumps(dict) print(m,type(m)) n = pickle.loads(m) print(n,type(n))
pickle.dump和pickle.load的使用:序列和反序列化到文件中的
#Author:Anliu import pickle dict = {"hostname":"zabbix", "IP":"192.168.42.111" } print(dict,type(dict)) with open("test_p1","wb") as f1: m = pickle.dump(dict,f1) with open('test_p1',"rb") as f2: n = pickle.load(f2) print(n,type(n))
序列化函数:
#Author:Anliu import pickle def logging(): print("This is a test of logging") m = pickle.dumps(logging) print(m,type(m)) n = pickle.loads(m) print(n,type(n)) n()
2.2 json模块的使用
方法不带s的是file文件中使用的
json.dumps 从字典(可序列化json的对象)转换为json格式数据
json.loads 从json到字典
json.dump
json.load
default:就是把任意一个对象变成一个可序列为JSON的对象
intent:格式化好看点
#Author:Anliu import json dict = {"hostname":"zabbix", "IP":"192.168.42.111" } print(dict,type(dict)) #with open("test_j1","w") as f: m = json.dumps(dict,indent=4) print(m,type(m)) n = json.loads(m) print(n,type(n)) 输出结果: {'hostname': 'zabbix', 'IP': '192.168.42.111'} <class 'dict'> { "hostname": "zabbix", "IP": "192.168.42.111" } <class 'str'> {'hostname': 'zabbix', 'IP': '192.168.42.111'} <class 'dict'>
序列化可调运的数据类型:
#Author:Anliu import json class Ball: def __init__(self, color): self.color = color ball = Ball("red") def ball2idict(bal): return { "color": bal.color } def dict2ball(odict): return Ball(odict["color"]) objdumps = json.dumps(ball, default=ball2idict) objloads = json.loads(objdumps, object_hook=dict2ball) print(objdumps) print(objloads)