• python学习之 -- 数据序列化


    json / pickle 数据序列化

    序列化定义:把变量从内存中变成可存储或传输的过程称为序列化。
    反序列化:把变量内容从序列化的对象重新读到内存里称为反序列胡。

    序列化模块之--pickle
    使用注意:在python3里,进行一次序列化后,然后在进行反序列化,不要重复多次序列化,否则无法进行反序列化。
    pickle:是python独有的序列化模块,只能作用于python变量,是将数据对象转化为bytes。
    功能:用于python特有的类型和python的数据类型间进行转换。
    举例:
    1 import pickle
    2 d = {'name':'jeck','age':'22'}
    3 print(pickle.dumps(d))
    View Code
    打印出:b'x80x03}qx00(Xx04x00x00x00nameqx01Xx08 #这里b代表为bytes
    pickle的4个功能如下:
    dumps , dump:进行序列化功能
    loads , load:进行反序列化功能

    序列化举例1:
    dumps 序列化作用于变量,将传入的变量序列化为一个bytes,然后可以写入磁盘。
    1 import pickle
    2 d = {'name':'jeck','age':'22','工作':'IT'}
    3 f = open('fname','wb') #必须以二进制读写
    4 f.write(pickle.dumps(d))
    5 f.close()
    View Code
    序列化举例2:
    dump 直接将变量序列化到文件中
    1 import pickle
    2 d = {'name':'jeck','age':'22','工作':'IT'}
    3 f = open('fname1','wb')
    4 pickle.dump(d,f)
    5 f.close()
    View Code
    反序列化举例1:
    loads:把对象从磁盘读入内存时,先把内容读到一个bytes,然后用loads进行反序列化
    1 import pickle
    2     f = open('fname','rb')
    3     print(pickle.loads(f.read())) #将bytes通过loads进行反序列化
    4 f.close()
    View Code
    反序列化举例2:
    load:直接将dump后的序列化文件进行反序列化载入。
    1 import pickle
    2     f = open('fname1','rb')
    3     print(pickle.load(f))
    4 f.close()
    View Code
    序列化模块之-- json
    json:是个对象序列化的标准格式,用于在不同编程语言之间进行对象的传递。类似的有xml。
    但和xml表现形式不同,json表现为一个字符串,xml是用标记标注的不易阅读。在速度上json也比xml快。
    注意:一般用于序列化通用的列表,字典,等常用序列。如果要序列化python里的函数,类需要单独指定
    方法和pickle一样,有:dumps,dump 进行序列化。loads,load 进行反序列化
    功能:用于字符串和python数据类型间进行转换。
    举例:json序列化后的格式为字符串
    1 import json
    2 d = {'name':'jeck','age':'22','工作':'IT'}
    3 print(json.dumps(d))
    4 print(type(json.dumps(d)))
    View Code
    打印:
    {"name": "jeck", "age": "22", "u5de5u4f5c": "IT"}
    <class 'str'>
    序列化举例1:
    dumps 序列化作用于变量,将传入的变量序列化为一个字符串,然后可以写入磁盘。
    1 import json
    2 d = {'name':'jeck','age':'22','工作':'IT'}
    3 f = open('fname','w')
    4 f.write(json.dumps(d))
    5 f.close()
    View Code
    序列化举例2:
    dump 直接将变量序列化到文件中
    import json
    d = {'name':'jeck','age':'22','工作':'IT'}
    f = open('fname1','w')
    json.dump(d,f)
    f.close()
    反序列化举例1:
    loads:先读取对象,然后用loads进行反序列化
    1 import json
    2 f = open('fname','r')
    3 print(json.loads(f.read())) #将字符串通过loads进行反序列化
    4 f.close()
    View Code
    反序列化举例2:
    load:直接将dump后的序列化文件进行反序列化载入。
    1 import json
    2 f = open('fname1','rb')
    3 print(json.load(f))
    4 f.close()
    View Code
    # 注意 json也可以序列化python中的函数和类,但是序列化后的数据只是函数或者类的结果数据。
    举例序列化一个类:
    1 import json
    2 def fun(n):
    3     return n
    4 x = fun('jeck')
    5 f = open('fname','w')
    6 f.write(json.dumps(x,default=fun))  #default参数就是告知json如何进行序列化
    7 f.close
    View Code
    一般通用方法为:
    print(json.dumps(x, default=lambda obj: obj.__dict__))
    其中的__dict__不需我们在类中定义,因为通常class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量.
    当然函数和类序列化一般也不会使用。

    在单独举例通过pickle对函数的序列化和反序列化举例
    1:进行函数的序列化
    1 import pickle
    2 def fun(n):
    3     return n
    4 f = open('fname','wb')
    5 f.write(pickle.dumps(fun))
    6 f.close  #成功
    View Code
    2:进行反序列化
    import pickle
    f = open('fname','rb')
    pickle.loads(f.read())
    f.close
    报错:AttributeError: Can't get attribute 'fun' on <module '__main__' from
    是因为序列化后内存已释放这个函数的内存地址,所以报错。需要手工把这个函数添加到反序列化开头如下:
    1 import pickle
    2 def fun(n):
    3     return n # 这个函数内容可以手工修改。
    4 f = open('fname','rb')
    5 print(pickle.loads(f.read()))
    6 f.close
    View Code
    这样才可以实现函数的反序列化,个人觉得没啥意义。而且反序列化时可以先修改函数内容,这样反序列化出的内容就是修改后的内容。

    注意:pickle和json的序列化和反序列化必须各自独自使用,不能相互混用。
  • 相关阅读:
    用C#编写获取远程IP,MAC的方法
    创建 TransactSQL 作业步骤
    S3C2440系统时钟
    C# 跟年月日判断星期几
    嵌入式系统启动例程
    使用HTML5和CSS3来创建幻灯片
    巧解Android时区加载过慢的问题
    HTML5之美
    C#如何取硬件标志
    S3C2440看门狗定时器(Watchdog)
  • 原文地址:https://www.cnblogs.com/zy6103/p/6837310.html
Copyright © 2020-2023  润新知