zoukankan      html  css  js  c++  java
  • day20.序列化模块

    参考云游道士:https://www.cnblogs.com/yyds/p/6563608.html

    1.什么是序列化

    序列化就是将字典,数字等数据类型转换为字符串数据类型

    所说的序列就是字符串

    2.为什么要序列化

    1.把内存中的各种数据类型的数据通过网络传送给其它机器或客户端;

    2.把内存中的各种数据类型的数据保存到本地磁盘持久化;

    相关模块

     json      用于实现Python数据类型与通用(json)字符串之间的转换,只有一部分数据类型可用json转换,数字,字符串,列表,字典,元祖

        常用方法:dumps()、dump()、loads()、load()

    pickle     用于实现Python数据类型与Python特定二进制格式之间的转换,所有数据类型都可以实现转换

        常用方法:dumps()、dump()、loads()、load()

    shelve   专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷.

        常用方法:open()

    3.JSON序列化/反序列化实例:

    序列化

    # 序列化
    import
    json ret = json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}) print(ret) {"a": "str", "c": true, "e": 10, "b": 11.1, "d": null, "f": [1, 2, 3], "g": [4, 5, 6]}

    sort_keys参数: 表示序列化时是否对dict的key进行排序(dict默认是无序的)

    import json
    ret = json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)},sort_keys=True)
    print(ret)
    {"a": "str", "b": 11.1, "c": true, "d": null, "e": 10, "f": [1, 2, 3], "g": [4, 5, 6]}

    indent参数: 表示缩进的意思,它可以使得数据存储的格式变得更加优雅、可读性更强;如果indent是一个非负整数或字符串,则JSON array元素和object成员将会被以相应的缩进级别进行打印输出;

    如果indent是0或负数或空字符串,则将只会插入换行,不会有缩进。

    import json
    ret = json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)},sort_keys=True,indent=4)
    print(ret)
    {
        "a": "str",
        "b": 11.1,
        "c": true,
        "d": null,
        "e": 10,
        "f": [
            1,
            2,
            3
        ],
        "g": [
            4,
            5,
            6
        ]
    }

    separators参数: 尽管indent参数可以使得数据存储的格式变得更加优雅、可读性更强,但是那是通过添加一些冗余的空白字符进行填充的。

    当json被用于网络数据通信时,应该尽可能的减少无用的数据传输,这样可以节省带宽并加快数据传输速度。

    json模块序列化Python对象后得到的json字符串中的','号和':'号分隔符后默认都会附加一个空白字符,我们可以通过separators参数重新指定分隔符,从而去除无用的空白字符;

    • 该参数的值应该是一个tuple(item_separator, key_separator)
    • 如果indent是None,其默认值为(', ', ': ')
    • 如果indent不为None,则默认值为(',', ': ')
    • 我们可以通过为separator赋值为(',', ':')来消除空白字符
    >>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)})
    '{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}'
    
    >>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, separators=(',',':'))
    '{"a":"str","c":true,"b":11.1,"e":10,"d":null,"g":[4,5,6],"f":[1,2,3]}'

    ensure_ascii参数: 当该参数的值为True(默认值)时,输出中的所有非ASCII字符(比如中文)都会被转义成'uXXXX'组成的序列,得到的结果是一个完全由ASCII字符组成的str实例。

    如果我们想得到一个人类可读的输出结果,需要把ensure_ascii参数的值设置为False。

    import json
    ret1 = json.dumps( {'name':'小明','age':16})
    print(ret1)
    {"name": "u5c0fu660e", "age": 16}
    ret2
    = json.dumps( {'name':'小明','age':16},ensure_ascii=False) print(ret2) {"name": "小明", "age": 16}

    反序列化

    import json
    ret1 = json.dumps( {'name':'小明','age':16},ensure_ascii=False)
    print(ret1)
    {"name": "小明", "age": 16}
    ret2
    = json.loads(ret1) print(ret2) {'name': '小明', 'age': 16}

    json的dump()与load()函数示例

    dump 和load 是针对文件进行操作的

    dic = {'a':1,'b':2,'c':3}
    with open('file',mode='w',encoding='utf-8') as f:
        json.dump(dic,f)
    ### json dump 会先将数据进行序列化,然后再写入文件中
    ### json load 则会将数据再文件读出来,序列化
    with open('file', mode='r', encoding='utf-8') as f:
        res = json.load(f)
        print(type(res),res)

    4.pickle模块

    pickle模块实现了用于对Python对象结构进行 序列化 和 反序列化 的二进制协议,与json不同的是,pickle限定于python使用

    pickle是二进制协议,读写也得基于二进制方式进行

    import pickle
    dic = {'k1':'v1','k2':'v2'}
    str_dic = pickle.dumps(dic)
    print(str_dic)  #一串二进制内容
    # b'x80x03}qx00(Xx02x00x00x00k1qx01Xx02x00x00x00v1qx02Xx02x00x00x00k2qx03Xx02x00x00x00v2qx04u.'
    dic2 = pickle.loads(str_dic)
    print(dic2)    #字典
    # {'k1': 'v1', 'k2': 'v2'}
    
    import time
    struct_time1  = time.localtime(1000000000)
    struct_time2  = time.localtime(2000000000)
    f = open('pickle_file','wb')
    pickle.dump(struct_time1,f)
    pickle.dump(struct_time2,f)
    f.close()
    # pickle的 dump 和 load 功能与json类似,都是基于文件操作的 f
    = open('pickle_file','rb') struct_time1 = pickle.load(f) struct_time2 = pickle.load(f) print(struct_time1.tm_year) print(struct_time2.tm_year) f.close()

    5.selve模块

    shelve是一个简单的数据存储方案,类似key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。

    shelve只有一个open()函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf对象。shelf是一种持久的、类似字典的对象。

    它与“dbm”的不同之处在于,其values值可以是任意基本Python对象--pickle模块可以处理的任何数据。这包括大多数类实例、递归数据类型和包含很多共享子对象的对象。keys还是普通的字符串。

    import shelve
    # 保存数据
    with shelve.open('student') as db:
        db['name'] = 'Tom'
        db['age'] = 19
        db['hobby'] = ['篮球', '看电影', '弹吉他']
        db['other_info'] = {'sno': 1, 'addr': 'xxxx'}
    
    # 读取数据
    with shelve.open('student') as db:
        for key,value in db.items():
            print(key, ': ', value)
    
    name :  Tom
    age :  19
    hobby :  ['篮球', '看电影', '弹吉他']
    other_info :  {'sno': 1, 'addr': 'xxxx'}
  • 相关阅读:
    【算法导论】第8章线性时间排序_计数排序、基数排序、桶排序
    c语言中字符串分割函数及实现
    【算法导论】第12章二叉查找树
    【算法导论】第6章堆排序及利用堆建立最小优先级队列
    【算法导论】第11章散列表
    atoi、itoa,strcpy,strcmp,memcpy等实现
    采用链地址法处理冲突构造哈希表
    【算法导论】第7章快速排序
    Warshall传递闭包算法的学习与实现
    矩阵的加、减、乘、除、求逆运算的实现
  • 原文地址:https://www.cnblogs.com/jiuyachun/p/10572215.html
Copyright © 2011-2022 走看看