zoukankan      html  css  js  c++  java
  • 廖雪峰Python学习笔记——序列化

    序列化

    定义:程序运行时所有变量都存在内存中,把变量从内存中变成可存储或可传输的过程称为序列化pickling,在其他语言中称为serialization,marshalling,flattening等等,都是一个意思。

    作用:序列化后可把序列化的内容存到磁盘,或者通过网络传输到其他机器上。

    实现方式:cPickle和pickle,前者是c语言写的速度更快。

    #用pickle.dumps()把任意对象序列化成一个str

    try:

        import cPickle as pickle

    except ImportError:

        import pickle

    >>> d = dict(name='Bob', age=20, score=88)

    >>> pickle.dumps(d)

    "(dp0 S'age' p1 I20 sS'score' p2 I88 sS'name' p3 S'Bob' p4 s."

    #用pickle.dump(d,f)d = dict(name ='Bob',age=23, score=90)

    f = open('py.txt','wb’)#在当前目录下新建了一个py.txt文件并将用wb方式处理文件

    pickle.dump(d,f)

    f.close()

    反序列化unplickling:把序列化之后的内容重新读入内存中。

    #如果是用一个str保存之前序列化后的内容,则用pickle.loads(str)得到反序列化后的内容:

    d = dict(name='Bob',age=20,score = 90)

    pd = pickle.dumps(d)

    upd = pickle.loads(pd)

    print upd

    #如果用的是文件保存序列化后的内容,用pickle.load()反序列化

    f =open('py.txt','rb')

    d = pickle.load(f)

    f.close()

    print d

    注意:pickle后的结果只能用于python且与py的版本有关,否则不兼容。所以pickle只能用到不重要的内容上。

    JSON

    定义:序列化的一种标准格式。python也内置了json模块。

    作用:如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

    #用json.dumps()把python对象序列化为json格式的str

    import json

    d = dict(name='Jane',age=23,score=90)

    js = json.dumps(d)

    print js

    #用json.dump()把python对象标准序列化到指定文件

    d = dict(name='Jane',age=23,score=90)

    f = open('py.txt','wb')

    json.dump(d,f)

    f.close()

    #用json.loads()和json.load()将json格式的内容反序列化

    >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'

    >>> json.loads(json_str)

    u'age'20u'score'88u'name'u'Bob’格式默认utf-8编码

    将类序列化为json与反序列化

    #将定义一个dict的类序列化为json格式的str

    import json

    class Student(object):

        def __init__(self,name,age,score):

            self.name = name

            self.age = age

            self.score = score

    s = Student('Jane',20,90)

    def class2dict(inst):

        return {

            'name':inst.name,

            'age':inst.age,

            'score':inst.score

        }

    sjson = json.dumps(s,default=class2dict)#这时s先化为dict再被序列化为json

    print sjson

    #更简洁通用地让类实例序列化为dict

    json.dumps(t,default=lambda obj:obj.__dict__)

    #使用lambda时直接用一个语句定义函数+得到返回值

    #每个类都有一个__dict__方法,用来储存各实例变量,除了一些定义了__slots__的class

    #将json格式的类的实例反序列化为dict

    import json

    class Stu(object):

        def __init__(self,name,age,score):

            self.name = name

            self.age=age

            self.score=score

    def dict2inst(i):

        return Stu(i['name'],i['age'],i['score'])

    json_dict = '{"score":90,"age":20,"name":"Jane"}'

    print json.loads(json_dict,object_hook=dict2inst)

    #先将dict转化为实例,再反序列化

  • 相关阅读:
    一个屌丝程序猿的人生(七十二)
    一个屌丝程序猿的人生(七十一)
    一个屌丝程序猿的人生(七十)
    一个屌丝程序猿的人生(六十九)
    一个屌丝程序猿的人生(六十八)
    一个屌丝程序猿的人生(六十七)
    Target-Action回调模式
    KVC & KVO
    ARC内存管理机制详解
    Objective-C中把URL请求的参数转换为字典
  • 原文地址:https://www.cnblogs.com/IcarusYu/p/7482001.html
Copyright © 2011-2022 走看看