模块讲解----pickle模块(只在python用的序列化与反序列化)

特点

1、只能在python中使用,只支持python的基本数据类型。

2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)

3、序列化的时候,只是序列化了整个序列对象,而不是内存地址。

一、内存中操作

import pickle
#dumps
li = [11,22,33]
r = pickle.dumps(li)
print(r)


#loads
result = pickle.loads(r)
print(result)

二、文本中操作

#dump:
li = [11,22,33]
pickle.dump(li,open('db','wb'))

#load
ret = pickle.load(open('db','rb'))
print(ret)

三、练习:

pickle的序列化:
格式:pickle.dumps(序列化对象)

#!/usr/bin/env python
# -*- coding:utf8 -*-
# Author:Dong Ye

import pickle


test = r'test.txt'

#反序列化代码中也要定义相同的函数名称,函数体没限制
def sayhi(name):
    print("hello",name)

info = {
    '':'',
    'age':32,
    'func':sayhi
}

print(pickle.dumps(info))

with open(test,'wb') as f:
    f.write( pickle.dumps(info) )

pickle返序列化:
格式:pickle.loads(读取文件逐行记录)

#!/usr/bin/env python
# -*- coding:utf8 -*-
# Author:Dong Ye

import pickle

test = r'test.txt'

#需要定义序列化代码中同样的函数名,函数体没限制
def sayhi(name):
    print("hello",name)
    print("hello2",name)




with open(test,'rb') as f:
    data = pickle.loads(f.read())
    print('data>>>',data)


print(data['func']("Alex"))


显示结果:
data>>> {'': '', 'age': 32, 'func': <function sayhi at 0x00000000007DF1E0>}
hello Alex
hello2 Alex
None


注意:
1、print(data['func']("Alex"))时,调用了pickle的反序列化变量data。

2、需要在序列化和反序列化定义相同的函数名称,但内容可以不一样。否则报错如下:
E:\python35\python.exe D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py
Traceback (most recent call last):
  File "D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py", line 16, in <module>
    data = pickle.loads(f.read())
AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py'>
原因是反序列化脚本中,没有sayhi函数的内存地址:

3、由于pickle序列化是序列了整个对象,而非某个内存地址,因此在反序列化时,也调用了整个序列对象。所以反序列化对象时,sayhi函数的函数体可以不一样。

 

写入文件并序列化

格式:pickle.demp(序列对象变量,文件名)

import pickle


test = r'test.txt'

#反序列化代码中也要定义相同的函数名称,函数体没限制
def sayhi(name):
    print("hello",name)

info = {
    '':'',
    'age':32,
    'func':sayhi
}

print(pickle.dumps(info))

with open(test,'wb') as f:
    #f.write( pickle.dumps(info) )
    pickle.dump(info,f)  #跟上面的f.write( pickle.dumps(info) )语意完全一样。

从文件中读取,并返序列化:

格式:pickle.load(文件名)

import pickle

test = r'test.txt'

#需要定义序列化代码中同样的函数名,函数体没限制
def sayhi(name):
    print("hello",name)
    print("hello2",name)



with open(test,'rb') as f:
    # data = pickle.loads(f.read())
    data = pickle.load(f)  #跟上面的data = pickle.loads(f.read())语意完全一样。
    print('data>>>',data)


print(data['func']("Alex"))

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值