概述
模塊
Pickle
實現了對一個 Python 對象結構的二進制的序列化和反序列化。? 即當Python程序持續運行一些字符串、列表字典、甚至自定義的類等數據對象,需要持久化存儲,即存儲在磁盤中,防止運行在內存中,因斷電等情況丟失數據。那么Pickle模塊就派上用場了,它可以將對象轉換為一種可以傳輸或存儲的格式。python的pickle模塊實現了基本的數據序列和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。
與JSON模塊的比較
可以看到pickle模塊和看似相似,但其還是有著本質的不同,即:
-
JSON 是一個文本序列化格式(它輸出 unicode 文本,盡管在大多數時候它會接著以?
utf-8
?編碼),而 pickle 是一個二進制序列化格式; -
JSON是字面量可讀的,而pickle不是(可以類比base64的不可讀性);
-
JSON是可互操作的,在Python系統之外廣泛使用,而pickle則是Python專用的;
序列化與反序列化
通過二進制的方式讀寫目標存儲文件,并利用
dump
序列化數據對象,
load
反序列化數據對象
D
=
{
'name'
:
'bob'
,
'major'
:
{
'english'
,
'math'
}
,
'd'
:
[
1
,
2
,
3
,
4
,
5
,
6
,
7
]
}
with
open
(
'D.pik'
,
'wb'
)
as
f
:
pickle
.
dump
(
D
,
f
)
with
open
(
'D.pik'
,
'rb'
)
as
f
:
D
=
pickle
.
load
(
f
)
print
(
type
(
D
)
)
print
(
D
)
示例結果:
{'name': 'bob', 'major': {'english', 'math'}, 'd': [1, 2, 3, 4, 5, 6, 7]}
當然我們也可以序列化到內存(字符串格式保存),然后對象可以以任何方式處理如通過網絡傳輸
pik
=
pickle
.
dumps
(
D
)
print
(
pik
)
D
=
pickle
.
loads
(
pik
)
print
(
type
(
D
)
)
print
(
D
)
示例結果:
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x05\x00\x00\x00majorq\x03cbuiltins\nset\nq\x04]q\x05(X\x07\x00\x00\x00englishq\x06X\x04\x00\x00\x00mathq\x07e\x85q\x08Rq\tX\x01\x00\x00\x00dq\n]q\x0b(K\x01K\x02K\x03K\x04K\x05K\x06K\x07eu.'
{'name': 'bob', 'major': {'english', 'math'}, 'd': [1, 2, 3, 4, 5, 6, 7]}
cPickle
cPickle包的功能和用法與pickle包幾乎完全相同 (其存在差別的地方實際上很少用到),不同在于cPickle是基于c語言編寫的,具有更好的性能,對于大多數應用程序,推薦使用該模塊。對于上面的例子,如果想使用cPickle包,我們都可以將import語句改為
import cPickle as pickle
進行使用。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
