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)