python序列化pickle模块和json模块简单学习

序列化:把变量从内存中变成可存储或传输的过程,在Python中叫pickling,在其他语言中也被称serialization,marshalling,flattening等等
反序列化:把变量内容从序列化的对象重新读到内存里

pcikel模块实现序列化

函数介绍:
pickel.dumps() 将一个对象序列化为一个bytes
pickle.dump() 直接吧对象序列花并写入一个file-like object
pickle.loads() 将bytes反序列化为一个对象
pickle.load() 直接从一个file-like object反序列化出对象

简单代码实例

#pickle模块的序列化,pickle序列化时是得到一个bytes
import pickle
d = dict(name='duan',age=45)
#利用pickle.dumps并写入文件
b = pickle.dumps(d)   #序列化为bytes
f = open('se.txt','wb')
f.write(b)
f.close()
#利用pickle.dump直接吸入一个file-like object
f = open('se.txt','wb')
pickel.dump(d,f)
f.close()

#反序列化,利用pickle.loads
f = open('se.txt','rb')
bs = f.read()
print(pickle.loads(bs))
f.close()
#反序列化,利用pickle.load直接反序列化一个file-like object
f = open('se.txt','rb')
print(pickle.load(f))
f.close()

json模块实现序列化和反序列化

json和python内置数据类型对应关系:
JSON类型 Python类型
{} dict
[] list
“string” str
1234.56 int或float
true/false True/False
null None

函数介绍:
json.dumps() 将一个对象序列化为一个str
json.dump() 直接吧对象序列花并写入一个file-like object
json.loads() 将json str反序列化为一个对象
json.load() 直接从一个file-like object反序列化出对象

简单代码实例
说明:
实例中包括dict的序列化反序列化和class实例的序列化和反序列化;

对于class实例在序列化时需要传入default参数,用来实现class实例和dict的转化,此处因为所有实例都有一个dict属性,所以可以用lambda表达式如下,序列化的过程为先吧class实例转化为dict,再序列化;

在反序列化时需要先序列化为dict,再用object_hook参数传入的转化函数将dict转化为class实例。

#json序列化,json序列化为一个str
import json
d = dict(name='bob',age =23)
#利用json.dumps序列化并写入一个文件
f = open('json.txt','w')
jt = json.dumps(d)
f.write(jt)
f.close()
#利用json.dump直接序列化写入一个file-like object
f = open('json.txt','w')
json.dump(d,f)

#利用json.loads()反序列化得到一个dict
f = open('json.txt','r')
print(json.loads(f.read()))
f.close()
#利用json.load()直接反序列化一个file-like object
f = open('json.txt','r')
print(json.load(f))
f.close()

#实现class实例的序列化和反序列
import json
class Student(object):
    def __init(self,name,age):
        self.name = name
        self.age = age

#在实现序列化时我们需要定义一个转化函数,将class实例转化为dict在序列化
def student2dict(obj):
    return {
            'name':obj.name,
            'age':obj.age
            }
#在反序列化先反序列化为一个dict,同时我们也需要一个函数,将dict转化为class实例 
def dict2student(di):
    reutrn Student(di['name'],di['age'])
#序列化
s = Student('bob',23)
print(json.dumps(s,default=student2dict))
#对于序列化时的转化函数,由于class实例都有一个__dict__属性,记录实例变量故
print(json.dumps(s,defailt= lambda obj:obj.__dict__))
#反序列化
json_str='{"name":"bob","age":23}'
print(json.loads(json_str,object_hook=dict2student))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值