天天看點

python——pickle子產品(用于Python對象的持久化存儲)pickle子產品介紹

pickle子產品介紹

pickle是一種用于存儲的持久化技術

首先從英文來了解一下這個子產品:pickle 是腌漬的意思,也就是把東西腌起來儲存成檔案,要用的時候讀出來洗洗還能用。

專業點的說法是:pickle是python序列化的一個工具!可以用來把對象來以檔案的形式存儲起來,用的時候再加載!

注意:pickle子產品隻能在python中使用,python中的幾乎所有的資料類型都可以序列化!但是序列化以後得到的檔案人看不懂!

pickle子產品内部實作了用于序列化和反序列化Python對象結構的二進制協定

“Pickling”是将python對象層次結構轉換成為位元組流

“unpickling”是反向操作,即位元組流(二進制檔案或者類似位元組的對象)轉換成python對象層次結構。

主要方法

子產品中有兩個主要的函數:dump()與load()

dump()函數

作用:實作python對象的序列化,将obj儲存到file中

具體文法:

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

obj:需要持久化儲存的對象

file:将對象序列化以後儲存到的類檔案對象

注意:必須有一個

protocol(default=4):可選參數,取值為 0、1、2、3、4、5

其中 0、1、2 對應 Python 早期的版本,3 、4、5 則對應 Python 3.x 版本及之後的版本。未指定情況下,預設為 4。

舉個例子:這裡來儲存一個字典試試看

import pickle
my_dict = {'name':'xuebi','age':24}
with open('text.txt','wb') as f:
    pickle.dump(my_dict,f)
           

執行代碼之後,可以看到在目前目錄下就有了一個txt檔案

python——pickle子產品(用于Python對象的持久化存儲)pickle子產品介紹

點開檢視後發現都是亂碼,人類确實看不太懂。

python——pickle子產品(用于Python對象的持久化存儲)pickle子產品介紹

dumps()函數

作用:傳回一個字元串,而不存入檔案

文法:

pickle.dumps(obj[, protocol])
           

接着對我們之前的字典進行存儲看一下效果:

import pickle

my_dict = {'name':'xuebi','age':24}
p1 = pickle.dumps(my_dict)
print(p1)
           

對傳回值進行列印,可以看到是一個字元串:

b'\x80\x04\x95\x1c\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05xuebi\x94\x8c\x03age\x94K\x18u.'

load()函數

作用:用于反序列化,将序列化的對象重新恢複成python對象

具體文法:

pickle.load(file)
           

将剛才存儲的檔案打開試試:

import pickle
file_path = './text.txt'
with open(file_path,'rb') as f:
    my_dict=pickle.load(f)
    print(my_dict)
    print(type(my_dict))
           

結果如下:

{'name': 'xuebi', 'age': 24}

<class 'dict'>

loads()函數

作用:從字元串中恢複對象。

文法:

pickle.loads(string)
           

試一下加載一下剛才存儲的那個字元串:

import pickle

my_dict = {'name':'xuebi','age':24}
p1 = pickle.dumps(my_dict)
t1 = pickle.loads(p1)
print(t1)
           

結果如下:

{'name': 'xuebi', 'age': 24}

Pickler()函數

作用:可以使用該對象調用dunmp 和 load 等方法。

文法:

class pickle.Pickler(file[, protocol])
           

clear_memo()函數:

作用:對于相同的對象,如果不使用clear_memo()方法,那麼python隻會pickle一次

總結

強大的 pickle 子產品,也有它的短闆,即 pickle 不支援并發地通路持久性對象,在複雜的系統環境下,尤其是讀取海量資料時,使用 pickle 會使整個系統的

I/O

讀取性能成為瓶頸。

這種情況下,可以使用 ZODB。

ZODB 是一個健壯的、多使用者的和面向對象的資料庫系統,專門用于存儲 Python 語言中的對象資料,它能夠存儲和管理任意複雜的 Python 對象,并支援事務操作和并發控制。

并且,ZODB 也是在 Python 的序列化操作基礎之上實作的,是以要想有效地使用 ZODB,必須先學好 pickle。