前言
今天的故事從持久化開始,最早知道持久化這個(gè)是上歷史課上,太祖論斷的xxx持久化,從此持久化就是一個(gè)高端、大氣、上檔次的詞語。后來轉(zhuǎn)行當(dāng)程序員,老是聽小伙伴說數(shù)據(jù)持久化,不明覺厲,不過因?yàn)閼?,也沒去搞明白是啥意思!今天剛好想學(xué)習(xí)pickle的知識(shí),看到了持久化一詞,去查了一下,哦,原來如此,妙不可言——果然是假大空!我已經(jīng)淺薄地理解為把數(shù)據(jù)存儲(chǔ)起來!
之前在python基礎(chǔ)里面我們有談到過python文件讀寫,其實(shí)就是一種字符串的持久化方式。那么我們可以把數(shù)據(jù)想辦法裝換為字符串,就可以實(shí)現(xiàn)數(shù)據(jù)的持久化。那么有沒有更好的方式呢?當(dāng)然有啦,今天一起學(xué)習(xí)python特有的數(shù)據(jù)持久化模塊pickle。
pickle詳解
- 把對(duì)象存儲(chǔ)到文件中
pickle.dump(obj, file[, protocol])
其中file是文件對(duì)象,open(file_name, "wb"), 以二進(jìn)制格式寫入
# 定義對(duì)象
a = [1, 2, 3, 4]
# 存儲(chǔ)到a.pkl
pickle.dump(a, open("a.pkl", "wb"))
- 加載存儲(chǔ)的pickle文件:
pickle.load(file)
其中file是文件對(duì)象,open(file_name, "rb"), 以二進(jìn)制格式讀取
a = pickle.dump(open("a.pkl", "rb"))
print(a) # 輸出 [1, 2, 3, 4]
- pickle還能就像序列化,把數(shù)據(jù)轉(zhuǎn)化為pickle二進(jìn)制的bytes,對(duì)應(yīng)的方法是
pickle.dumps(obj), pickle.loads(obj) - 對(duì)于pickle,數(shù)據(jù)寫入是什么類型,加載后就是什么類型,特別簡單方便。pickle支持存儲(chǔ)自定義類型,但是加載的時(shí)候自定義數(shù)據(jù)類型必須import或者加載類 [1]。
寫在最后
pickle的口號(hào)是,一切都對(duì)象皆可持久化,簡單方便直接暴力美啊,大家有什么想存儲(chǔ)的對(duì)象,趕緊用pickle吧!pickle還有一個(gè)小兄弟json,它能對(duì)json格式對(duì)象進(jìn)行持久化或者加載,json格式文件在很多語言都是通用的,所以處理json文件時(shí)候建議使用json模塊。類似numpy里面也定義了save持久化的函數(shù),但是底層其實(shí)是使用的pickle方法...
名詞解釋
- 持久化(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對(duì)象)保存到可永久保存的存儲(chǔ)設(shè)備中(如磁盤)。持久化的主要應(yīng)用是將內(nèi)存中的對(duì)象存儲(chǔ)在數(shù)據(jù)庫中,或者存儲(chǔ)在磁盤文件中、XML數(shù)據(jù)文件中等等。)
- 序列化 (Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程。在序列化期間,對(duì)象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲(chǔ)區(qū)。以后,可以通過從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。