用來將對象持久化的python pickle模塊
前言
pickle 模塊可以對一個 Python 對象的二進制進行序列化和反序列化。說白了,就是它能夠?qū)崿F(xiàn)任意對象與二進制直接的相互轉(zhuǎn)化,也可以實現(xiàn)對象與文本之間的相互轉(zhuǎn)化。
比如,我程序里有一個 python 對象,我想把它存到磁盤里,于是我用 pickle 把他轉(zhuǎn)到一個文本里。當(dāng)后面我想使用的時候,讀取出來時候依然是一個 python 對象。
一、pickle 模塊下的方法
pickle 模塊提供了以下 4 種方法:
- dump():將 Python 中的對象序列化成二進制對象,并寫入文件
- load():讀取指定的序列化數(shù)據(jù)文件,并返回對象
- dumps():將 Python 中的對象序列化成二進制對象,并直接返回,而不是將其寫入到文件
- loads():讀取給定的二進制對象數(shù)據(jù),并將其轉(zhuǎn)換為 Python 對象
1. dumps()
將 Python 中的對象序列化成二進制對象,并直接返回。
示例
import pickle test_list = ["pingguo", {1, 2, 3}, None] # 使用 dumps() 函數(shù)將 test_list 轉(zhuǎn)成 p1 p1 = pickle.dumps(test_list) print(p1) print("返回類型:", type(p1))
輸出結(jié)果:
b'\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.' 返回類型: <class 'bytes'>
2. loads()
讀取給定的二進制對象數(shù)據(jù),并將其轉(zhuǎn)換為 Python 對象。
示例在上面的基礎(chǔ)上繼續(xù):
import pickle test_list = ["pingguo", {1, 2, 3}, None] # 使用 dumps() 函數(shù)將 test_list 轉(zhuǎn)成 p1 p1 = pickle.dumps(test_list) print(p1) print("返回類型:", type(p1)) # 使用 loads() 函數(shù)將 p1 轉(zhuǎn)成 Python 對象 p2 p2 = pickle.loads(p1) print(p2) print("返回類型:", type(p2))
輸出結(jié)果:
b'\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.' 返回類型: <class 'bytes'> ['pingguo', {1, 2, 3}, None] 返回類型: <class 'list'>
pickle 反序列化后的對象與原對象是等值的副本對象,類似deepcopy。
3. dump()
將 Python 中的對象序列化成二進制對象,并寫入文件。
示例
import pickle test_list = ["pingguo", {1, 2, 3}, None] with open("test_pickle.txt", "wb") as f: # 使用 dump() 函數(shù)將 test_list 轉(zhuǎn)成 p1,寫到txt文本里 pickle.dump(test_list, f)
注意這里的寫文件是 "wb",以二進制格式打開一個文件只用于寫入,否則會報錯。
執(zhí)行成功后,同級目錄下生成一個test_pickle.txt
文件,因為是二進制內(nèi)容,直接打開看到的是亂碼。
4. load()
讀取指定的序列化數(shù)據(jù)文件,并返回對象。
示例
import pickle test_list = ["pingguo", {1, 2, 3}, None] with open("test_pickle.txt", "wb") as f: # 使用 dump() 函數(shù)將 test_list 轉(zhuǎn)成 p1,寫到txt文本里 pickle.dump(test_list, f) with open("test_pickle.txt", "rb") as f: # 將二進制文件對象轉(zhuǎn)換成 Python 對象 p3 p3 = pickle.load(f) print(p3) print("類型:", type(p3))
注意,這里讀取文件用rb
,也就是以二進制格式打開一個文件用于只讀。
執(zhí)行成功。
['pingguo', {1, 2, 3}, None] 類型: <class 'list'>
二、可以被 pickle 封存/解封的對象
下列類型可以被封存:
- None、True 和 False
- 整數(shù)、浮點數(shù)、復(fù)數(shù)
- str、byte、bytearray
- 只包含可封存對象的集合,包括 tuple、list、set 和 dict
- 定義在模塊最外層的函數(shù)(使用 def 定義,lambda 函數(shù)則不可以)
- 定義在模塊最外層的內(nèi)置函數(shù)
- 定義在模塊最外層的類
- 某些類實例,這些類的 dict 屬性值或 getstate() 函數(shù)的返回值可以被封存。
三、pickle 與 json 的區(qū)別
python 提供的 json 標(biāo)準(zhǔn)庫相信大家都熟悉,提供的方法也與 pickle 相似,那么兩者有什么區(qū)別呢?
- JSON 是一個文本序列化格式,pickle 是一個二進制序列化格式。
- JSON 是我們可以直觀閱讀的,而 pickle 不行。
- JSON是可互操作的,在Python之外也可以使用,而pickle則是Python專用的。
- 默認情況下,JSON 只能表示 Python 內(nèi)置類型的子集,不能表示自定義的類;但 pickle 可以表示大量的 Python 數(shù)據(jù)類型。
- JSON不像 pickle,對一個不信任的JSON進行反序列化的操作本身不會造成任意代碼執(zhí)行漏洞。
關(guān)于最后一點,說的是 pickle 模塊并不安全。很有可能你去解封的是惡意構(gòu)建的 pickle 數(shù)據(jù),造成解封時執(zhí)行了惡意代碼,所以要慎用。
以上就是用來將對象持久化的python pickle模塊的詳細內(nèi)容,更多關(guān)于python對象持久化pickle模塊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python enumerate函數(shù)功能與用法示例
這篇文章主要介紹了Python enumerate函數(shù)功能與用法,結(jié)合實例形式分析了enumerate函數(shù)針對列表、字符串遍歷操作相關(guān)使用技巧,需要的朋友可以參考下2019-03-03淺談Python編程中3個常用的數(shù)據(jù)結(jié)構(gòu)和算法
這篇文章主要介紹了淺談Python編程中3個常用的數(shù)據(jù)結(jié)構(gòu)和算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04python實現(xiàn)在遍歷列表時,直接對dict元素增加字段的方法
今天小編就為大家分享一篇python實現(xiàn)在遍歷列表時,直接對dict元素增加字段的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01