函数和常用模块【day06】:pickle模块(十一)

本节内容

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    #输出的函数体中的逻辑也是可以变的,这边我就不做演示了

 小结:

  1. json值支持简单的数据类型,pickle支持所有的数据类型。
  2. pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  3. pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
  4. pickle和json在3.0中只能dump一次和load一次,在2.7里面可以dump多次,load多次,anyway,以后只记住,只需要dump一次,load一次就可以了。

猜你喜欢

转载自www.cnblogs.com/luoahong/p/9890969.html