pickle的序列化規則

2021-06-01 08:17:57 字數 4342 閱讀 4967

python規範(python-specific)提供了pickle的序列化規則。這就不必擔心不同版本的python之間序列化相容性問題。預設情況下,pickle的序列化是基於文字的,我們可以直接用文字編輯器檢視序列化的文字。我們也可以序列成二進位制格式的資料,這樣的結果體積會更小。更詳細的內容,可以參考python手冊pickle模組。

下面就開始使用pickle吧~

pickle.dump(obj, file[, protocol])

序列化物件,並將結果資料流寫入到檔案物件中。引數protocol是序列化模式,預設值為0,表示以文字的形式序列化。protocol的值還可以是1或2,表示以二進位制的形式序列化。

pickle.load(file)

反序列化物件。將檔案中的資料解析為乙個python物件。下面通過乙個簡單的例子來演示上面兩個方法的使用:

1 #coding=gbk

2 3 

importpickle,stringio

4 5 

class

person(object):

6 '''自定義型別。

7 '''

8def__init__(self,

name,

address):

9 self.name

=name

10 self.address

=address

11 12 

def

display(self):

13print'name:',self.name,'address:',self.address

14 15 jj=

person("jgood","中國

杭州")

16 jj.display()

17 file

=stringio.stringio()

18 19 

pickle.dump(jj,

file,0)

#序列化

20 #print file.getvalue()   #列印序列化後的結果

#del person #反序列的時候,必須能找到對應類的定義。否則反序列化操作失敗。

21 22 

file.seek(0)

23 jj1

=pickle.load(file)#反序列化

24 jj1.display()

25 26 

file.close()

注意:在反序列化的時候,必須能找到對應類的定義,否則反序列化將失敗。在上面的例子中,如果取消#del person的注釋,在執行時將拋attributeerror異常,提示當前模組找不到person的定義。

pickle.dumps(obj[, protocol])

pickle.loads(string)

我們也可以直接獲取序列化後的資料流,或者直接從資料流反序列化。方法dumps與loads就完成這樣的功能。dumps返回序列化後的資料流,loads返回的序列化生成的物件。

python模組中還定義了兩個類,分別用來序列化、反序列化物件。

class pickle.pickler(file[, protocal]):

該類用於序列化物件。引數file是乙個類檔案物件(file-like object),用於儲存序列化結果。可選引數表示序列化模式。它定義了兩個方法:

dump(obj):

將物件序列化,並儲存到類檔案物件中。引數obj是要序列化的物件。

clear_memo()

清空pickler的「備忘」。使用pickler例項在序列化物件的時候,它會「記住」已經被序列化的物件引用,所以對同一物件多次呼叫dump(obj),pickler不會「傻傻」的去多次序列化。下面是乙個簡單的例子:

1 #coding=gbk

2importpickle,stringio

3 4 

class

person(object):

5 '''自定義型別。

6 '''

7def__init__(self,

name,

address):

8 self.name

=name

9 self.address

=address

10 11 

def

display(self):

12print'name:',self.name,'address:',self.address

13 14 

fle=stringio.stringio()

15 pick

=pickle.pickler(fle)

16 person

=person("jgood","hangzhou

china")

17 18 

pick.dump(person)

19 val1

=fle.getvalue()

20printlen(val1)

21 22 

pick.clear_memo()

#注釋此句,再看看執行結果

23 24 

pick.dump(person)

#對同一引用物件再次進行序列化

25 val2

=fle.getvalue()

26printlen(val2)

27 28 

#---- 結果 ----

29 #148

30 #296

31 #

32 #將這行**注釋掉:pick.clear_memo()

33 #結果為:

34 #148

35 #152

36 

class pickle.unpickler(file):

該類用於反序列化物件。引數file是乙個類檔案(file-like object)物件,unpickler從該引數中獲取資料進行反序列化。

load():

反序列化物件。該方法會根據已經序列化的資料流,自動選擇合適的反序列化模式。

1 #.... 接上個例子中的**

2 3 

fle.seek(0)

4 unpick

=pickle.unpickler(fle)

5print

unpick.load()6 

上面介紹了pickle模組的基本使用,但和marshal一樣,並不是所有的型別都可以通過pickle序列化的。例如對於乙個巢狀的型別,使用pickle序列化就失敗。例如:

1class

a(object):

2class

b(object):

3def__init__(self,

name):

4 self.name

=name

5 6 

def__init__(self):

7print'init

a'8 9 b

=a.b("my

name")

10print

b11 

c=pickle.dumps(b,0)#失敗哦

12printpickle.loads(c)

關於pickle支援的序列化型別,可以參考python手冊。

python手冊中的pickle模組,介紹了更高階的主題,例如自定義序列化過程。有時間再和大家分享。

Python序列化與反序列化pickle用法例項

要將python物件作為乙個檔案的形式儲存到磁碟,就叫序列化 當我們需要用到這個這物件,再從磁碟載入這個物件,就叫反序列化 python自帶的pickle可以幫我們實現,pickle這個單詞是鹹菜的意思,鹹菜耐儲存,是不是很形象呀?物件的儲存分為兩步 1.將物件在記憶體中的資料抓取取來,轉換成乙個有...

Python json和pickle序列化

1.序列化 把記憶體的一些資料物件存到硬碟。資料物件是一些基本資料型別,如list dict,set等。2.反序列化 將硬碟的內容載入成原來的資料物件。3.為什麼要用序列化與反序列化 當你想把乙個資料暫時儲存起來而過會又要用的時候,就可以把它先儲存到硬碟,保證安全性。需要時在取出來。4.json序列...

python 實用pickle序列化

儲存資料結構到乙個檔案中稱為序列化。相json這樣的格式需要定製的序列化資料的轉換器。python提供了pickle模組以特殊的二進位制格式儲存和恢復資料物件。還記得json解析datetime物件時出現問題?但對於pickle就不存在問題 import pickle import diatomit...