欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中的序列化與反序列化的使用

 更新時間:2015年06月30日 12:14:33   作者:DarkBull  
這篇文章主要介紹了詳解Python中的序列化與反序列化的使用,針對pickle和cPickle對象進行了探究,需要的朋友可以參考下

學習過marshal模塊用于序列化和反序列化,但marshal的功能比較薄弱,只支持部分內置數(shù)據(jù)類型的序列化/反序列化,對于用戶自定義的類型就無能為力,同時marshal不支持自引用(遞歸引用)的對象的序列化。所以直接使用marshal來序列化/反序列化可能不是很方便。還好,python標準庫提供了功能更加強大且更加安全的pickle和cPickle模塊。

cPickle模塊是使用C語言實現(xiàn)的,所以在運行效率上比pickle要高。但是cPickle模塊中定義的類型不能被繼承(其實大多數(shù)時候,我們不需要從這些類型中繼承。)。cPickle和pickle的序列化/反序列化規(guī)則是一樣的,我們可以使用pickle序列化一個對象,然后使用cPickle來反序列化。同時,這兩個模塊在處理自引用類型時會變得更加“聰明”,它不會無限制的遞歸序列化自引用對象,對于同一對象的多次引用,它只會序列化一次。例如:
 

import marshal, pickle
 
list = [1]
list.append(list)
byt1 = marshal.dumps(list) 
#出錯, 無限制的遞歸序列化
byt2 = pickle.dumps(list) 
#No problem
pickle的序列化規(guī)則

Python規(guī)范(Python-specific)提供了pickle的序列化規(guī)則。這就不必擔心不同版本的Python之間序列化兼容性問題。默認情況下,pickle的序列化是基于文本的,我們可以直接用文本編輯器查看序列化的文本。我們也可以序列成二進制格式的數(shù)據(jù),這樣的結果體積會更小。更詳細的內容,可以參考Python手冊pickle模塊。

下面就開始使用pickle吧~
pickle.dump(obj, file[, protocol])

序列化對象,并將結果數(shù)據(jù)流寫入到文件對象中。參數(shù)protocol是序列化模式,默認值為0,表示以文本的形式序列化。protocol的值還可以是1或2,表示以二進制的形式序列化。
pickle.load(file)

反序列化對象。將文件中的數(shù)據(jù)解析為一個Python對象。下面通過一個簡單的例子來演示上面兩個方法的使用:
 

#coding=gbk
 
import pickle, StringIO
 
class Person(object):
 
'''自定義類型。
 
'''
 def __init__(self, name, address):
  self.name = name
  self.address = address
  
  def display(self):
  print 'name:', self.name, 'address:', self.address 
 
jj = Person("JGood", "中國 杭州")
jj.display()
file = StringIO.StringIO()
 
pickle.dump(jj, file, 0) 
#序列化
#print file.getvalue() #打印序列化后的結果
  
#del Person #反序列的時候,必須能找到對應類的定義。否則反序列化操作失敗。
file.seek(0)
jj1 = pickle.load(file) 
#反序列化
jj1.display()
file.close()

注意:在反序列化的時候,必須能找到對應類的定義,否則反序列化將失敗。在上面的例子中,如果取消#del Person的注釋,在運行時將拋AttributeError異常,提示當前模塊找不到Person的定義。
pickle.dumps(obj[, protocol])
pickle.loads(string)

我們也可以直接獲取序列化后的數(shù)據(jù)流,或者直接從數(shù)據(jù)流反序列化。方法dumps與loads就完成這樣的功能。dumps返回序列化后的數(shù)據(jù)流,loads返回的序列化生成的對象。

python模塊中還定義了兩個類,分別用來序列化、反序列化對象。
class pickle.Pickler(file[, protocal]):

該類用于序列化對象。參數(shù)file是一個類文件對象(file-like object),用于保存序列化結果??蛇x參數(shù)表示序列化模式。它定義了兩個方法:
dump(obj):

將對象序列化,并保存到類文件對象中。參數(shù)obj是要序列化的對象。
clear_memo()

清空pickler的“備忘”。使用Pickler實例在序列化對象的時候,它會“記住”已經(jīng)被序列化的對象引用,所以對同一對象多次調用dump(obj),pickler不會“傻傻”的去多次序列化。下面是一個簡單的例子:
 

#coding=gbk
import pickle, StringIO
 
class Person(object):
 
'''自定義類型。
 
'''
 def __init__(self, name, address):
  self.name = name
  self.address = address
  
 def display(self):
  print 'name:', self.name, 'address:', self.address 
   
fle = StringIO.StringIO()
pick = pickle.Pickler(fle)
person = Person("JGood", "Hangzhou China") 
 
pick.dump(person)
val1 = fle.getvalue()
print len(val1)
 
pick.clear_memo() 
#注釋此句,再看看運行結果
 
pick.dump(person) 
#對同一引用對象再次進行序列化
val2 = fle.getvalue()
print len(val2)
 
#---- 結果 ----
#148
#296
#
#將這行代碼注釋掉:pick.clear_memo()
#結果為:
#148
#152
class pickle.Unpickler(file):

該類用于反序列化對象。參數(shù)file是一個類文件(file-like object)對象,Unpickler從該參數(shù)中獲取數(shù)據(jù)進行反序列化。
load():

反序列化對象。該方法會根據(jù)已經(jīng)序列化的數(shù)據(jù)流,自動選擇合適的反序列化模式。
 

#.... 接上個例子中的代碼
 
fle.seek(0)
unpick = pickle.Unpickler(fle)
print unpick.load()

上面介紹了pickle模塊的基本使用,但和marshal一樣,并不是所有的類型都可以通過pickle序列化的。例如對于一個嵌套的類型,使用pickle序列化就失敗。例如:
 

class A(object):
 class B(object):
  def __init__(self, name):
   self.name = name
  
 def __init__(self):
  print 'init A'
 
b = A.B("my name")
print b
c = pickle.dumps(b, 0) 
#失敗哦
print pickle.loads(c)

關于pickle支持的序列化類型,可以參考Python手冊。

相關文章

  • python進階TensorFlow神經(jīng)網(wǎng)絡擬合線性及非線性函數(shù)

    python進階TensorFlow神經(jīng)網(wǎng)絡擬合線性及非線性函數(shù)

    這篇文章是python進階學習主要介紹了TensorFlow神經(jīng)網(wǎng)絡擬合線性及非線性函數(shù)原理及示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • python實現(xiàn)彈跳小球

    python實現(xiàn)彈跳小球

    這篇文章主要為大家詳細介紹了python實現(xiàn)彈跳小球,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python中字符串相關操作的運算符總結

    Python中字符串相關操作的運算符總結

    這篇文章主要介紹了Python之字符串相關操作的運算符,本文通過案例給大家詳細講解python字符串運算符的說明,需要的朋友可以參考下
    2023-12-12
  • Python中優(yōu)化NumPy包使用性能的教程

    Python中優(yōu)化NumPy包使用性能的教程

    這篇文章主要介紹了Python中優(yōu)化NumPy包使用性能的教程,包括內存和拷貝等方面,需要的朋友可以參考下
    2015-04-04
  • Jupyter notebook如何實現(xiàn)打開數(shù)據(jù)集

    Jupyter notebook如何實現(xiàn)打開數(shù)據(jù)集

    這篇文章主要介紹了Jupyter notebook如何實現(xiàn)打開數(shù)據(jù)集問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • numba CUDA報錯的問題解決

    numba CUDA報錯的問題解決

    本文主要介紹了numba CUDA報錯的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Python模擬鋼琴鍵盤實現(xiàn)演奏數(shù)鴨子歌曲

    Python模擬鋼琴鍵盤實現(xiàn)演奏數(shù)鴨子歌曲

    前幾天上課老師給我們講了兩個模塊,然后利用這兩個模塊來模擬鋼琴鍵盤去簡單地演奏《數(shù)鴨子》今天來分享給大家,感興趣的可以了解一下
    2022-11-11
  • Python QQBot庫的QQ聊天機器人

    Python QQBot庫的QQ聊天機器人

    這篇文章主要為大家詳細介紹了基于Python QQBot庫的QQ聊天機器人,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Pandas多級索引的實現(xiàn)示例

    Pandas多級索引的實現(xiàn)示例

    Pandas 中的多級索引是一種強大的工具,用于處理具有多個維度或層次的數(shù)據(jù),本文主要介紹了Pandas多級索引的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • python中telnetlib模塊的使用方式

    python中telnetlib模塊的使用方式

    這篇文章主要介紹了python中telnetlib模塊的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論