模塊講解----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"))
注意:
需要定義序列化代碼中同樣的函數名


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM