zoukankan      html  css  js  c++  java
  • Python序列化

    #最近在根据廖雪峰老师的python教程学习,以下是学习过程中做的一些笔记。

    序列化

      之前有讲过php序列化和反序列化,,相信大家对序列化有一些的了解,在程序运行过程中所有的变量都是在内存中的,当程序运行完毕,所有的内存都会被系统收回,我们把变量从内存中变成可存储或传输的过程称为序列化。在python中叫pickling。

      序列化之后,就可以把序列化之后的内容写入磁盘,进行保存出传输等。,反过来把变量内容从序列化的对象重新读取到内存中称为反序列化,即unpickling。python提供了pickle模块来实现序列化。

    >>>import pickle
    >>>d = dict(name='Bob',age=20,score=89)
    >>>pickle.dumps(d)
    b'x80x03}qx00(Xx04x00x00x00nameqx01Xx03x00x00x00bobqx02Xx03x00x00x00ageqx03Kx14Xx05x00x00x00scoreqx04KYu.'

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

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

  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/twlr/p/12341804.html
Copyright © 2011-2022 走看看