本节内容
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一次就可以了。