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

Python pickle類庫介紹(對象序列化和反序列化)

 更新時間:2014年11月21日 09:20:03   投稿:junjie  
這篇文章主要介紹了Python pickle類庫介紹(對象序列化和反序列化),本文講解了pickle庫的作用、pickle的運(yùn)行過程、使用實(shí)例、修改picklable類型的默認(rèn)行為等內(nèi)容,需要的朋友可以參考下

一、pickle

pickle模塊用來實(shí)現(xiàn)python對象的序列化和反序列化。通常地pickle將python對象序列化為二進(jìn)制流或文件。
 
python對象與文件之間的序列化和反序列化:

復(fù)制代碼 代碼如下:

pickle.dump()
pickle.load()

如果要實(shí)現(xiàn)python對象和字符串間的序列化和反序列化,則使用:
復(fù)制代碼 代碼如下:

pickle.dumps()
pickle.loads()

 
可以被序列化的類型有:
* None,True 和 False;
* 整數(shù),浮點(diǎn)數(shù),復(fù)數(shù);
* 字符串,字節(jié)流,字節(jié)數(shù)組;
* 包含可pickle對象的tuples,lists,sets和dictionaries;
* 定義在module頂層的函數(shù):
* 定義在module頂層的內(nèi)置函數(shù);
* 定義在module頂層的類;
* 擁有__dict__()或__setstate__()的自定義類型;
 

注意:對于函數(shù)或類的序列化是以名字來識別的,所以需要import相應(yīng)的module。

二、pickle的運(yùn)行過程

在大部分情況下,要是的對象picklable,我們不需要額外的代碼。默認(rèn)地pickle將智能地檢查類和實(shí)例的屬性,當(dāng)一個類實(shí)例反序列化的時候,它的__init__()方法通常不被調(diào)用。而是首先創(chuàng)建一個未初始化的實(shí)例,然后再回復(fù)存儲的屬性。
 

但是可以通過實(shí)現(xiàn)下列的方法來修改默認(rèn)的行為:

復(fù)制代碼 代碼如下:

object.__getstate__() :默認(rèn)地序列化對象的__dict__,但是如果你實(shí)現(xiàn)了__getstate__(),則__getstate__()函數(shù)返回的值將被序列化。
object.__setstate__(state) :如果類型實(shí)現(xiàn)了此方法,則在反序列化的時候,此方法用來恢復(fù)對象的屬性。
object.__getnewargs__() : 如果實(shí)例構(gòu)造的時候(__new__())需要參數(shù),則需要實(shí)現(xiàn)此函數(shù)。

注意:如果__getstate__()返回False,則在反序列化的時候__setstate__()則不被調(diào)用。

有的時候?yàn)榱诵剩蛏厦娴?個函數(shù)不能滿足需求時,需要實(shí)現(xiàn)__reduce__()函數(shù)。

三、實(shí)例

復(fù)制代碼 代碼如下:

import pickle

# An arbitrary collection of objects supported by pickle.
data = {
    'a': [1, 2.0, 3, 4+6j],
    'b': ("character string", b"byte string"),
    'c': set([None, True, False])
}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

   
with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)
    print(str(data))

四、修改picklable類型的默認(rèn)行為  

復(fù)制代碼 代碼如下:

class TextReader:
    """Print and number lines in a text file."""

    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename)
        self.lineno = 0

    def readline(self):
        self.lineno += 1
        line = self.file.readline()
        if not line:
            return None
        if line.endswith('\n'):
            line = line[:-1]
        return "%i: %s" % (self.lineno, line)

    def __getstate__(self):
        # Copy the object's state from self.__dict__ which contains
        # all our instance attributes. Always use the dict.copy()
        # method to avoid modifying the original state.
        state = self.__dict__.copy()
        # Remove the unpicklable entries.
        del state['file']
        return state

    def __setstate__(self, state):
        # Restore instance attributes (i.e., filename and lineno).
        self.__dict__.update(state)
        # Restore the previously opened file's state. To do so, we need to
        # reopen it and read from it until the line count is restored.
        file = open(self.filename)
        for _ in range(self.lineno):
            file.readline()
        # Finally, save the file.
        self.file = file
       
reader = TextReader("hello.txt")
print(reader.readline())
print(reader.readline())
s = pickle.dumps(reader)
#print(s)
new_reader = pickle.loads(s)
print(new_reader.readline())

# the output is
# 1: hello
# 2: how are you
# 3: goodbye


相關(guān)文章

  • Pandas如何通過np.array函數(shù)或tolist方法去掉數(shù)據(jù)中的index

    Pandas如何通過np.array函數(shù)或tolist方法去掉數(shù)據(jù)中的index

    這篇文章主要介紹了Pandas如何通過np.array函數(shù)或tolist方法去掉數(shù)據(jù)中的index問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python利用蒙特卡羅模擬期權(quán)定價

    Python利用蒙特卡羅模擬期權(quán)定價

    期權(quán)是一種合約,它賦予買方在未來某個時間點(diǎn)以特定價格買賣資產(chǎn)的權(quán)利。本文將利用蒙特卡羅模擬期權(quán)定價,感興趣的小伙伴可以了解一下
    2022-04-04
  • python中_del_還原數(shù)據(jù)的方法

    python中_del_還原數(shù)據(jù)的方法

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python中_del_還原數(shù)據(jù)的方法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • python實(shí)現(xiàn)百萬答題自動百度搜索答案

    python實(shí)現(xiàn)百萬答題自動百度搜索答案

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)百萬答題自動百度搜索答案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python命令行參數(shù)化的四種方式詳解

    Python命令行參數(shù)化的四種方式詳解

    在日常編寫 Python 腳本的過程中,我們經(jīng)常需要結(jié)合命令行參數(shù)傳入一些變量參數(shù),使項(xiàng)目使用更加的靈活方便。本文章羅列了構(gòu)建 Python命令行參數(shù)的4種常見方式,需要的可以參考一下
    2022-06-06
  • AUC計(jì)算方法與Python實(shí)現(xiàn)代碼

    AUC計(jì)算方法與Python實(shí)現(xiàn)代碼

    今天小編就為大家分享一篇AUC計(jì)算方法與Python實(shí)現(xiàn)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python爬蟲之xpath的基本使用詳解

    python爬蟲之xpath的基本使用詳解

    本篇文章主要介紹了python爬蟲之xpath的基本使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • python實(shí)現(xiàn)數(shù)獨(dú)游戲 java簡單實(shí)現(xiàn)數(shù)獨(dú)游戲

    python實(shí)現(xiàn)數(shù)獨(dú)游戲 java簡單實(shí)現(xiàn)數(shù)獨(dú)游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)數(shù)獨(dú)游戲和java實(shí)現(xiàn)數(shù)獨(dú)游戲的相關(guān)代碼,比較兩種語言實(shí)現(xiàn)數(shù)獨(dú)游戲的區(qū)別
    2018-03-03
  • Python基于回溯法子集樹模板解決找零問題示例

    Python基于回溯法子集樹模板解決找零問題示例

    這篇文章主要介紹了Python基于回溯法子集樹模板解決找零問題,簡單描述了找零問題并結(jié)合具體實(shí)例形式分析了Python使用回溯法子集樹模板解決找零問題的步驟、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • 基于python實(shí)現(xiàn)usb熱插拔檢測

    基于python實(shí)現(xiàn)usb熱插拔檢測

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)用于在Linux系統(tǒng)中監(jiān)測USB設(shè)備的熱插拔,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-05-05

最新評論