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檔案
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyITOzATN1EjM3ADNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
點開檢視後發現都是亂碼,人類确實看不太懂。
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。