Python序列化
#最近在根据廖雪峰老师的python教程学习,以下是学习过程中做的一些笔记。
序列化
之前有讲过php序列化和反序列化,,相信大家对序列化有一些的了解,在程序运行过程中所有的变量都是在内存中的,当程序运行完毕,所有的内存都会被系统收回,我们把变量从内存中变成可存储或传输的过程称为序列化。在python中叫pickling。
序列化之后,就可以把序列化之后的内容写入磁盘,进行保存出传输等。,反过来把变量内容从序列化的对象重新读取到内存中称为反序列化,即unpickling。python提供了pickle模块来实现序列化。
>>>import pickle >>>d = dict(name='Bob',age=20,score=89) >>>pickle.dumps(d) b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04KYu.'
pickle.dumps()方法将对象转为bytes格式,就可以把这个bytes写入文件;或者利用另一种方法pickle.dump(),直接将对象写入file-like object:
>>>f = open('dump.txt','wb') >>>pickle.dump(d,f) >>>f.close()
这个时候再看所在目录产生一个dump.txt的文档。
当我们需要读取内容的时候可以利用pickle.load()方法将对象读出,也可以利用pickle.loads()将对象反序列化出:
>>> f = open('dump.txt', 'rb') >>> d = pickle.load(f) >>> f.close() >>> d {'age': 20, 'score': 89, 'name': 'Bob'}
变量的内容就又读出来了。
JSON格式
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但是json是更好的方法,json格式转化为一个字符串可以被所有语言所读取,也可以进行存储和传输。
python内置json格式模块提供了非常完善的格式转换。
>>> import json >>> d = dict(name='Bob', age=20, score=88) >>> json.dumps(d) #返回一个字符串 '{"age": 20, "score": 88, "name": "Bob"}'
dumps()方法返回一个str(),内容就是标准的JSON,dump()方法可以直接啊JSON写入一个文件。
要把JSON反序列化为python格式对象,用loads()或者对应的load()方法;前者把JSON的字符串反序列化,后者从file-like Object
中读取字符串并反序列化:
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}' >>> json.loads(json_str) {'age': 20, 'score': 88, 'name': 'Bob'}
注:由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的str
与JSON的字符串之间转换。
不过更多时候我们习惯用一个类:
class Student(object): def __init__(self,name,age,score): self.name=name self.score=score self.age=age s = Student('bob',20,88) print(json.dump(s))
我们直接打印以上代码,发现居然报错,因为默认情况下,dumps()
方法不知道如何将Student
实例变为一个JSON的{}
对象;所以我们需要将目标转为一个dict对象:
def student2dict(std): return { 'name':std.name, 'age':std.age, 'score':std.score }
我们添加以上代码再进行打印:
>>> print(json.dumps(s, default=student2dict)) {"age": 20, "name": "Bob", "score": 88}
这次顺利转为JSON.。也可以直接调用__dict__属性:
>>>print(json.dumps(s.__dict__))
{"age": 20, "name": "Bob", "score": 88}
总结
序列化模块中,pickle.dumps()方法将对象转为bytes格式;pickle.dump()将对象序列化进文件中;pickle.load()将目标反序列化为对象;
JSON格式中,json.dumps()方法返回一个str;json.loads()方法返回字典。
如有不足或错误之处请评论指出,如果觉得有用的话,可以右侧请作者喝茶。