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()方法返回字典。

 

  如有不足或错误之处请评论指出,如果觉得有用的话,可以右侧请作者喝茶。

posted @ 2020-02-21 16:16  终落  阅读(377)  评论(0编辑  收藏  举报
页脚Html代码