1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 # 序列化: 例如把字典写进文件 5 info = { 6 'name': 'alex', 7 'age': 22 8 } 9 10 f = open('test.text', 'w') 11 f.write(str(info)) # 把字典作为字符串写进文件 12 f.close() 13 14 15 # 反序列化: 接上例, 把文件中的字符串读取并转换成字典 16 f = open('test.text', 'r') 17 data = eval(f.read()) 18 f.close() 19 print(data['age']) 20 21 22 # 用json来完成序列化 23 import json 24 info = { 25 'name': 'alex', 26 'age': 22 27 } 28 29 f = open('test.text', 'w') 30 print(json.dumps(info)) 31 f.write(json.dumps(info)) # 序列化 32 f.close() 33 34 35 # 用json来完成反序列化 36 f = open('test.text', 'r') 37 data = json.loads(f.read()) # 反序列化 38 print(data['age']) 39 40 41 # 序列化更复杂的应用, 不支持. json只能进行简单数据的序列化. json主要支持不同语言之间进行数据交互,所以太复杂的做不了. xml在逐渐被json取代. 42 def sayhi(name): 43 print('hello', name) 44 45 info = { 46 'name': 'alex', 47 'age': 22, 48 'func': sayhi 49 } 50 51 f = open('test.text', 'w') 52 f.write(json.dumps(info)) # 失败. json不能处理这种复杂的信息. 53 f.close() 54 55 56 # 若需要处理更复杂的数据, 用pickle. pickle只有在Python里能用, 其它语言不行. 57 # 序列化. 58 import pickle 59 def sayhi(name): 60 print('hello', name) 61 62 f = open('test.text', 'wb') 63 64 info = { 65 'name': 'alex', 66 'age': 22, 67 'func': sayhi 68 } 69 70 f.write(pickle.dumps(info)) # pickle会默认转换成二进制,所以读取方式应该是wb而不是w. 71 f.close() 72 73 74 # 反序列化 75 import pickle 76 def sayhi(name): 77 print('hello2', name) # 反序列化一个不同的函数(名字一样, 方法体不一样),也可以. ? 如果没有序列化过, 为佳么可以反序列化? 78 79 f = open('test.text', 'rb') 80 81 82 data = pickle.loads(f.read()) # 反序列化. 这样会出错, 因为函数sayhi用完就释放了, 内存地址就不存在了. 所以这 83 print(data['func']('Alex'))
1 # 序列化. 2 import pickle 3 def sayhi(name): 4 print('hello', name) 5 6 info = { 7 'name': 'alex', 8 'age': 22, 9 'func': sayhi 10 } 11 12 f = open('test.text', 'wb') 13 14 pickle.dump(info, f) # 等同于 f.write(pickle.dumps(info)) 15 f.close() 16 17 18 # 反序列化 19 import pickle 20 def sayhi(name): 21 print('hello2', name) # 反序列化一个不同的函数(名字一样, 方法体不一样),也可以. ? 如果没有序列化过, 为佳么可以反序列化? 22 23 f = open('test.text', 'rb') 24 25 26 data = pickle.load(f) # 等同于 data = pickle.loads(f.read()) 27 print(data['func']('Alex'))
1 # 序列化. dumps两次, loads的时候会出错 . 所以最好只dumps 一次, load 一次. 2 import json 3 4 info = { 5 'name': 'alex', 6 'age': 22 7 } 8 9 f = open('test.text', 'w') 10 11 f.write(json.dump(info, f)) # 等同于 f.write(pickle.dumps(info)) 12 13 14 info['age'] = 21 15 f.write(json.dumps(info)) # 这样会存两个字典进去. 两个字典的age值不同. 16 17 18 f.close() 19 20 21 # 反序列化 22 import json 23 24 f = open('test.text', 'r') 25 data = json.loads(f) 26 27 print(data)