您的位置:首页 > 编程语言 > Python开发

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

2018-01-01 16:36 876 查看
序列化:把变量从内存中变成可存储或传输的过程,在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()
91cd

#实现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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: