模块讲解----pickle模块(只在python用的序列化与反序列化)

特点

1、只能在python中使用,只支持python的基本数据类型。
2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)
3、序列化的时候,只是序列化了整个序列对象,而不是内存地址。
 
一、内存中操作:
 1 import pickle
 2 #dumps
 3 li = [11,22,33]
 4 r = pickle.dumps(li)
 5 print(r)
 6 
 7 
 8 #loads
 9 result = pickle.loads(r)
10 print(result)

 

二、文本中操作:

1 #dump:
2 li = [11,22,33]
3 pickle.dump(li,open('db','wb'))
4 
5 #load
6 ret = pickle.load(open('db','rb'))
7 print(ret)

 

三、练习:

pickle的序列化:
格式:pickle.dumps(序列化对象)

 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 # Author:Dong Ye
 4 
 5 import pickle
 6 
 7 
 8 test = r'test.txt'
 9 
10 #反序列化代码中也要定义相同的函数名称,函数体没限制
11 def sayhi(name):
12     print("hello",name)
13 
14 info = {
15     '':'',
16     'age':32,
17     'func':sayhi
18 }
19 
20 print(pickle.dumps(info))
21 
22 with open(test,'wb') as f:
23     f.write( pickle.dumps(info) )

 

pickle返序列化:
格式:pickle.loads(读取文件逐行记录)

 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 # Author:Dong Ye
 4 
 5 import pickle
 6 
 7 test = r'test.txt'
 8 
 9 #需要定义序列化代码中同样的函数名,函数体没限制
10 def sayhi(name):
11     print("hello",name)
12     print("hello2",name)
13 
14 
15 
16 
17 with open(test,'rb') as f:
18     data = pickle.loads(f.read())
19     print('data>>>',data)
20 
21 
22 print(data['func']("Alex"))
23 
24 
25 显示结果:
26 data>>> {'': '', 'age': 32, 'func': <function sayhi at 0x00000000007DF1E0>}
27 hello Alex
28 hello2 Alex
29 None
30 
31 
32 注意:
33 1、print(data['func']("Alex"))时,调用了pickle的反序列化变量data。
34 
35 2、需要在序列化和反序列化定义相同的函数名称,但内容可以不一样。否则报错如下:
36 E:\python35\python.exe D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py
37 Traceback (most recent call last):
38   File "D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py", line 16, in <module>
39     data = pickle.loads(f.read())
40 AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py'>
41 原因是反序列化脚本中,没有sayhi函数的内存地址:
42 
43 3、由于pickle序列化是序列了整个对象,而非某个内存地址,因此在反序列化时,也调用了整个序列对象。所以反序列化对象时,sayhi函数的函数体可以不一样。

 

 

写入文件并序列化

格式:pickle.demp(序列对象变量,文件名)
 1 import pickle
 2 
 3 
 4 test = r'test.txt'
 5 
 6 #反序列化代码中也要定义相同的函数名称,函数体没限制
 7 def sayhi(name):
 8     print("hello",name)
 9 
10 info = {
11     '':'',
12     'age':32,
13     'func':sayhi
14 }
15 
16 print(pickle.dumps(info))
17 
18 with open(test,'wb') as f:
19     #f.write( pickle.dumps(info) )
20     pickle.dump(info,f)  #跟上面的f.write( pickle.dumps(info) )语意完全一样。
 
 
 
从文件中读取,并返序列化:
格式:pickle.load(文件名)
 1 import pickle
 2 
 3 test = r'test.txt'
 4 
 5 #需要定义序列化代码中同样的函数名,函数体没限制
 6 def sayhi(name):
 7     print("hello",name)
 8     print("hello2",name)
 9 
10 
11 
12 with open(test,'rb') as f:
13     # data = pickle.loads(f.read())
14     data = pickle.load(f)  #跟上面的data = pickle.loads(f.read())语意完全一样。
15     print('data>>>',data)
16 
17 
18 print(data['func']("Alex"))
注意:
需要定义序列化代码中同样的函数名
posted @ 2017-12-21 14:34  风之岚翔  阅读(21541)  评论(1编辑  收藏  举报