#最近在根据廖雪峰老师的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()方法返回字典。
如有不足或错误之处请评论指出,如果觉得有用的话,可以右侧请作者喝茶。