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

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

  • 相关阅读:
    iOS uitableView响应事件被拦截
    《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)
    Codeforces 475B Strongly Connected City 强连通裸题
    hdu1501&&poj2192 Zipper(DFS)
    hdu 4031 Attack(树状数组区间更新单点求值&暴力)
    Bash Shell 流程控制 —— select
    Longest Valid Parentheses
    HDU 2955 Robberies
    浅谈 Objective-C Associated Objects
    浅谈 Objective-C Associated Objects
  • 原文地址:https://www.cnblogs.com/twlr/p/12341804.html
Copyright © 2011-2022 走看看