函式和常用模組【day06】:pickle模組(十一)
阿新 • • 發佈:2018-11-01
本節內容
1、dumps序列化和loads反序列化
2、dump序列化和load反序列化
3、序列函式
1、dumps序列化和loads反序列化
dumps()序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import
pickle
info
=
{
'name'
:
"zhangqigao"
,
"age"
:
22
,
}
with
open
(
"test.txt"
,
"wb"
) as f:
#以二進位制的形式寫入
data
=
pickle.dumps(info)
#序列化成字串
f.write(data)
#寫入test.txt 檔案中
#輸出到test.txt檔案中的內容
�}q (X ageqKX nameqX
zhangqigaoqu.
|
loads()反序列化
1 2 3 4 5 6 7 8 9 |
import
pickle
with
open
(
"test.txt"
,
"rb"
) as f:
#以二進位制的模式讀
data
=
pickle.loads(f.read())
#反序列化操作
print
(data.get(
"age"
))
#輸出
22
|
2、dump序列化和load反序列化
dump()序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import
pickle
info
=
{
'name'
:
"zhangqigao"
,
"age"
:
22
,
}
with
open
(
"test.txt"
,
"wb"
) as f:
pickle.dump(info,f)
#序列化
#輸出
�}q (X ageqKX nameqX
zhangqigaoqu.
|
load()反序列化
1 2 3 4 5 6 7 8 9 |
import
pickle
with
open
(
"test.txt"
,
"rb"
) as f:
data
=
pickle.load(f)
#反序列化成記憶體物件
print
(data.get(
"age"
))
#輸出
22
|
從上面的結果觀察,json和pickle好像也沒什麼區別?但是別忘了,我們說,json只能序列化簡單的資料型別,而pickle可以序列化python中所有的資料型別,包括函式、類等,下面我們就來看看,如何序列化函式的。還有就是,pickle序列化的是位元組,而json序列化的是字元,這個要注意一下。
3、序列化函式
①序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import
pickle
def
sayhi(name):
#函式
print
(
"hello:"
,name)
info
=
{
'name'
:
"zhangqigao"
,
"age"
:
22
,
"func"
:sayhi
#"func"對應的值sayhi,是函式名
}
with
open
(
"test.txt"
,
"wb"
) as f:
data
=
pickle.dumps(info)
f.write(data)
#輸出test.txt
�}q (X funcqc__main__
sayhi
qX ageqKX nameqX
zhangqigaoqu.
|
②反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import
pickle
def
sayhi(name):
#在反序列化中必須寫上此函式,不然會報錯,因為在載入的時候,函式沒有載入到記憶體
print
(
"hello:"
,name)
with
open
(
"test.txt"
,
"rb"
) as f:
data
=
pickle.loads(f.read())
print
(data.get(
"age"
))
data.get(
"func"
)(
"zhangqigao"
)
#執行函式sayhi
#輸出
22
hello: zhangqigao
#輸出的函式體中的邏輯也是可以變的,這邊我就不做演示了
|
小結:
- json值支援簡單的資料型別,pickle支援所有的資料型別。
- pickle只能支援python本身的序列化和反序列化,不能用作和其他語言做資料互動,而json可以。
- pickle序列化的是整個的資料物件,所以反序列化函式時,函式體中的邏輯變了,是跟著心的函式體走的。
- pickle和json在3.0中只能dump一次和load一次,在2.7裡面可以dump多次,load多次,anyway,以後只記住,只需要dump一次,load一次就可以了。