用來將對(duì)象持久化的python pickle模塊
前言
pickle 模塊可以對(duì)一個(gè) Python 對(duì)象的二進(jìn)制進(jìn)行序列化和反序列化。說白了,就是它能夠?qū)崿F(xiàn)任意對(duì)象與二進(jìn)制直接的相互轉(zhuǎn)化,也可以實(shí)現(xiàn)對(duì)象與文本之間的相互轉(zhuǎn)化。
比如,我程序里有一個(gè) python 對(duì)象,我想把它存到磁盤里,于是我用 pickle 把他轉(zhuǎn)到一個(gè)文本里。當(dāng)后面我想使用的時(shí)候,讀取出來時(shí)候依然是一個(gè) python 對(duì)象。
一、pickle 模塊下的方法
pickle 模塊提供了以下 4 種方法:
- dump():將 Python 中的對(duì)象序列化成二進(jìn)制對(duì)象,并寫入文件
- load():讀取指定的序列化數(shù)據(jù)文件,并返回對(duì)象
- dumps():將 Python 中的對(duì)象序列化成二進(jìn)制對(duì)象,并直接返回,而不是將其寫入到文件
- loads():讀取給定的二進(jìn)制對(duì)象數(shù)據(jù),并將其轉(zhuǎn)換為 Python 對(duì)象
1. dumps()
將 Python 中的對(duì)象序列化成二進(jìn)制對(duì)象,并直接返回。
示例
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()
讀取給定的二進(jìn)制對(duì)象數(shù)據(jù),并將其轉(zhuǎn)換為 Python 對(duì)象。
示例在上面的基礎(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 對(duì)象 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 反序列化后的對(duì)象與原對(duì)象是等值的副本對(duì)象,類似deepcopy。
3. dump()
將 Python 中的對(duì)象序列化成二進(jìn)制對(duì)象,并寫入文件。
示例
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",以二進(jìn)制格式打開一個(gè)文件只用于寫入,否則會(huì)報(bào)錯(cuò)。
執(zhí)行成功后,同級(jí)目錄下生成一個(gè)test_pickle.txt文件,因?yàn)槭嵌M(jìn)制內(nèi)容,直接打開看到的是亂碼。

4. load()
讀取指定的序列化數(shù)據(jù)文件,并返回對(duì)象。
示例
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:
# 將二進(jìn)制文件對(duì)象轉(zhuǎn)換成 Python 對(duì)象 p3
p3 = pickle.load(f)
print(p3)
print("類型:", type(p3))
注意,這里讀取文件用rb,也就是以二進(jìn)制格式打開一個(gè)文件用于只讀。
執(zhí)行成功。
['pingguo', {1, 2, 3}, None]
類型: <class 'list'>
二、可以被 pickle 封存/解封的對(duì)象
下列類型可以被封存:
- None、True 和 False
- 整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù)
- str、byte、bytearray
- 只包含可封存對(duì)象的集合,包括 tuple、list、set 和 dict
- 定義在模塊最外層的函數(shù)(使用 def 定義,lambda 函數(shù)則不可以)
- 定義在模塊最外層的內(nèi)置函數(shù)
- 定義在模塊最外層的類
- 某些類實(shí)例,這些類的 dict 屬性值或 getstate() 函數(shù)的返回值可以被封存。
三、pickle 與 json 的區(qū)別
python 提供的 json 標(biāo)準(zhǔn)庫相信大家都熟悉,提供的方法也與 pickle 相似,那么兩者有什么區(qū)別呢?
- JSON 是一個(gè)文本序列化格式,pickle 是一個(gè)二進(jìn)制序列化格式。
- JSON 是我們可以直觀閱讀的,而 pickle 不行。
- JSON是可互操作的,在Python之外也可以使用,而pickle則是Python專用的。
- 默認(rèn)情況下,JSON 只能表示 Python 內(nèi)置類型的子集,不能表示自定義的類;但 pickle 可以表示大量的 Python 數(shù)據(jù)類型。
- JSON不像 pickle,對(duì)一個(gè)不信任的JSON進(jìn)行反序列化的操作本身不會(huì)造成任意代碼執(zhí)行漏洞。
關(guān)于最后一點(diǎn),說的是 pickle 模塊并不安全。很有可能你去解封的是惡意構(gòu)建的 pickle 數(shù)據(jù),造成解封時(shí)執(zhí)行了惡意代碼,所以要慎用。
以上就是用來將對(duì)象持久化的python pickle模塊的詳細(xì)內(nèi)容,更多關(guān)于python對(duì)象持久化pickle模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python enumerate函數(shù)功能與用法示例
這篇文章主要介紹了Python enumerate函數(shù)功能與用法,結(jié)合實(shí)例形式分析了enumerate函數(shù)針對(duì)列表、字符串遍歷操作相關(guān)使用技巧,需要的朋友可以參考下2019-03-03
python自動(dòng)化實(shí)現(xiàn)的簡單使用
本文主要介紹了python自動(dòng)化實(shí)現(xiàn)的簡單使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Python3多線程基礎(chǔ)知識(shí)點(diǎn)
在本篇內(nèi)容里小編給大家分享了關(guān)于Python3多線程基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,需要的朋友們跟著學(xué)習(xí)參考下。2019-02-02
淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法
這篇文章主要介紹了淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
python實(shí)現(xiàn)在遍歷列表時(shí),直接對(duì)dict元素增加字段的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)在遍歷列表時(shí),直接對(duì)dict元素增加字段的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01

