zoukankan      html  css  js  c++  java
  • 序列化及json&pickle的使用

    一、序列化

      序列化是指把内存里的数据类型转变成字符串。以使其能存储到硬盘或通过网络传输到远程。——硬盘或网络传输时只能接受bytes。

    Python中用于序列化的两个模块:

    • json:用于字符串和Python数据类型之间进行转换
    • pickle:用于Python特有类型和Python数据类型间进行转换。

      json和pickle模块都提供了四个功能:dumps、dump、loads、load

    1、序列化

    # 把内存数据转成字符,叫做序列化
    data = {
        'roles':[
            {'role':'monster','type':'pig'},
            {'role':'hero','type':'关羽'}
        ]
    }
    
    f = open("game_status","w")
    # f.write(data)   # 写入失败,write只能接收字符串或者是bytes
    f.write(str(data))  # 内容写入文件中

    2、反序列化

    # 把字符转成内存数据类型,叫做反序列化
    f = open("game_status","r")
    d = f.read()
    d = eval(d)
    print(d['roles'])

    二、json模块

    把数据类型转成字符串存到内存里的意义:

      1、把你的内存数据通过网络共享给远程其他人

      2、定义了不同语言之间的交互规则

        纯文本:不能共享复杂的数据类型

        xml:占空间大

        json:相对来说,简单且可读性好。

    import json
    data = {
        'roles':[
            {'role':'monster','type':'pig'},
            {'role':'hero','type':'关羽'}
        ]
    }
    
    d = json.dumps(data)  # 仅转为字符串,可以存入硬盘
    print(d,type(d))
    """
    输出:{"roles": [{"role": "monster", "type": "pig"}, {"role": "hero", "type": "u5173u7fbd"}]} <class 'str'>
    """
    
    f = open("test.json","w")  # 创建文件对象
    d1 = json.dump(data,f)  # dump不仅将数据变为字符串还直接写入文件,但是只能存入文件对象中
    
    
    d2 = json.loads(d)  # 仅把字符串转为相应的数据类型
    print(d2['roles'],type(d2))
    """
    输出:[{'role': 'monster', 'type': 'pig'}, {'role': 'hero', 'type': '关羽'}] <class 'dict'>
    """
    
    # 从文件中读入:
    f = open("test.json","r")
    data = json.load(f)
    print(data['roles'])
    

    三、pickle模块

    import pickle
    
    d = {'name':'alex','age':22}
    l = [1,2,3,4,'rain']
    pk = open("data.pkl","wb")  # 针对bytes内容必须配置为wb模式
    print(pickle.dumps(d))  # b'x80x03}qx00(Xx04x00x....  bytes类型
    pickle.dump(d,pk)
    """
    data.pkl文件内容:�}q(XnameqXalexqXageqKu.
    文件格式不可直接读。
    """
    
    f = open("data.pkl","rb")
    d = pickle.load(f)
    print(d)
    """
    输出:{'name': 'alex', 'age': 22}
    """
    
    def sayhi():
        print('dddddd')
    
    pickle.dumps(sayhi)
    """
    执行不报错,说明pickle可以支持函数序列化
    """

    四、json&pickle对比

    json:

      优点:跨语言、体积小

      缺点:只能支持intstrlist upledict

    pickle:

      优点:专为Python设计,支持Python所有的数据类型。

      缺点:只能在Python中使用,存储数据占空间大。

  • 相关阅读:
    LCA最近公共祖先Tarjan(离线)
    51nod 1135 原根
    51nod 1134最长递增子序列
    51nod 1130 斯特林公式
    51nod 1186 Miller-Rabin素数测试
    51Nod 1257 背包问题 V3
    另类求组合数
    Gym
    msp430项目编程45
    msp430项目编程44
  • 原文地址:https://www.cnblogs.com/xiugeng/p/8717619.html
Copyright © 2011-2022 走看看