1. 程式人生 > >python序列化與反序列化(json與pickle)

python序列化與反序列化(json與pickle)

類型 成了 數據類型 進行 pick 直接 python 優點 一個

在python中,序列化可以理解為將python中對象的編碼格式轉換為json(pickle)格式的字符串,而反序列化可以 理解為將json(pickle)格式的字符串轉換為python中對象的編碼格式

舉一個簡單的例子,我們在vmvare環境下編寫python程序,然後需要臨時走開一下,但是我們又不想把這個vmvare關閉,這個時候我們可以選擇掛機,這樣我們再回來繼續操作時候,就可以直接恢復到走之前的狀態,那麽我們之前編寫的代碼及vmvare的狀態是保存在哪裏了呢,實際上是保存在文件當中來了,但是我們知道文件只能對字符串這種類型的數據進行處理,這時候在操作過程中,當我們將數據存入文件當中的時候,我們就需要將python對象的編碼格式轉換成字符串格式,即序列化,同樣的,當我們在恢復python中的編碼時候,就需要把字符串的編碼格式轉換成我們需要的編碼格式,即所謂的反序列化。而恰好python中的json和pickle模塊可以用來實現這一功能

json

json提供了四個功能:dumps,dump,loads,load(前面兩個都是用來實現序列化的,後面兩個用來實現反序列化)

首先我們來看一下如果不用json序列化到底能不能實現對文件的操作

我們創建一個文件,向裏面存入一個字典看看行不行

技術分享圖片

結果呢

技術分享圖片

很明顯報錯了,告訴我們寫進文件的內容一定得是字符串格式的,不是字典。

我們試著用json模塊寫入吧

技術分享圖片

結果創建了一個文件,並且相應的內容也寫進去了

技術分享圖片

上面我們用了json的dumps功能實現的序列化,我們再用dump實現一下,代碼簡化了

技術分享圖片

結果是一樣的

我們再來看看反序列化

如果我們不用反序列化,看看能不能找到字典中的name對應的額元素呢

技術分享圖片

技術分享圖片

結果是不可以的

那我們來導入json模塊吧

技術分享圖片

技術分享圖片

我們再用json的另一個反序列化功能load寫一下這段代碼

技術分享圖片

結果是一樣的

看起來json的功能很強大但是他只能用來實現對列表,字典,字符串這樣簡單的數據類型進行處理,對於復雜的比如函數就處理不了了,但是他有他的優點,就是可以實現與java等其他語言的交互,鑒於json的局限性,我們試一試pickle吧,他能實現對一切對象的序列化及反序列化操作,但是他不能實現與其他語言的交互

我們先來看看json遇到復雜對象的情況,為此我們定義了一個niusha函數,將他的內存地址添加到字典中

技術分享圖片

結果似乎差強人意啊

技術分享圖片

報錯了

我們再用pickle試試

技術分享圖片

結果怎麽變成了這樣

技術分享圖片

註意哈,這裏我們用pickle.dumps默認變成了二進制。所以報錯了。我們需要改動一下

技術分享圖片

將文件的寫的方式改為“wb”即可

我們再來看看pickle的反序列化

技術分享圖片

結果怎麽出錯了呢

技術分享圖片

這是因為我們在序列化中定義的niusha函數,使用完之後就被釋放了,所以我們在反序列化過程中找不到這個函數,這裏我們是為了證明pickle可以序列化函數等復雜的對象,在實際中是不應該這樣用的,如果是在要這麽用,我們只能將序列化中的代碼copy過來

技術分享圖片

這樣結果就出來了

技術分享圖片

註意,這裏我們都只是嘗試了pickle的dump,與load方法,他的dumps功能與loads功能與json用法是一樣的,這裏就不再描述了

python序列化與反序列化(json與pickle)