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