代码改变世界

json & pickle 序列化

2018-05-02 16:11  钱先生  阅读(172)  评论(0编辑  收藏  举报
 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)