zoukankan      html  css  js  c++  java
  • json&pickle模块

    json&pickle模块

    1 序列化简介

    1.1 什么是序列化

    • 把对象(变量)从内存中变成可存储或传输的过程称为序列化

    • 在python中叫pickling

    • 在其他语言中叫serialization、marshalling、flattening等

    1.2 序列化作用

    • 持久保持状态

      软件/程序的执行就是处理一系列状态的变化。

      在编程语言中,'状态'会以变量的形式保存在内存中。

      内存无法永久保存数据,断电或重启会被清空。

      在断电或重启前将程序内存中所有数据保存到文件中,下次程序执行会在文件中载入之前的数据,然后解释执行,这就是序列化。

    • 跨平台数据交互

      序列化之后可以将内容写入磁盘,还可以通过网络传输到别的机器上

      如果收发双方约定好使用一种序列化格式就打破平台/语言的限制,实现跨平台数据交互

      把变量从序列化的对象重新读到内存里称之为反序列化,即unpickling

    2 json

    2.1 用处及用法

    2.1.1 用处

    • 把某个语言的变量转成json格式字符串

    • 存取数据(格式标准),一个程序写入,另一个程序读取(两程序可以不同语言)

    • 后端给前端的数据是json格式字符串

    2.1.2 用法

    {"name":"ccc","age":18,"handsome":true,"xxx":null}
    
    json类型 python类型
    {} dict
    [] list
    "string" str
    123.456 int/float
    true/false True/False
    null None

    内存中结构化的数据<---->格式json<---->字符串<---->保存到文件或基于网络传输

    2.2 序列化与反序列化

    2.2.1 基本使用

    • 序列化:把python中的字典、列表、布尔数据类型转为json格式字符串

    • 反序列化:把json格式字符串转成某个语言的变量

    • 补充:在Java中,处于性能考虑有许多包完成序列化与反序列化(谷歌的gson、阿里开源的fastjson)

    2.2.2 序列化

    import json  # 导入json模块,内置模块
    
    # 定义一个字典
    dic = {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None}
    # 把字典转换成json格式字符串
    dic_str = json.dumps(dic)
    print(dic_str, type(dic_str))
    # {"name": "ccc", "age": 18, "handsome": true, "xxx": null} <class 'str'>
    

    2.2.3 反序列化

    # 定义一个json格式的字符串
    s = """
    {"name": "ccc", "age": 18, "handsome": true, "xxx": null}
    """
    # 把json格式字符串转成字典
    s_dic = json.loads(s)
    print(s_dic, type(s_dic))
    # {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None} <class 'dict'>
    

    2.3 写入文件

    2.3.1 序列化

    # 复杂写法
    dic = {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None}
    dic_str = json.dumps(dic)
    print(dic_str)  # {"name": "ccc", "age": 18, "handsome": true, "xxx": null}
    with open('a.json', 'wt', encoding='utf-8') as f:
        f.write(dic_str)
    
    # 简化写法
    dic = {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None}
    with open('a.json', 'wt', enncoding='utf-8') as f:
        json.dump(dic, f)
    

    2.3.2 反序列化

    with open('a.json', 'rt', encoding='utf-8') as f:
        dic = json.load(f)
        
    print(dic, type(dic))
    

    2.4 总结

    • 序列化 json.dumps()

    • 反序列化 json.loads()

    • 序列化并保存到文件中 json.dump()

    • 从文件反序列化回来 json.load()

    补充:

    dic = {'name': '曹嘉鑫', 'age': 18, 'handsome': True, 'xxx': None}
    print(json.dumps(dic))  # 遇到中文会显示成unicode
    print(json.dumps(dic, ensure_ascii=False))
    # {"name": "曹嘉鑫", "age": 18, "handsome": true, "xxx": null}
    

    3 pickle

    3.1 序列化与按序列化

    3.1.1 序列化

    import pickle  # 内置模块
    dic = {'name': 'ccc', 'age': 18}
    res = pickle.dumps(dic)
    print(res)	  # 显示成b格式
    

    3.1.2 反序列化

    import pickle
    b = b'x80x04x95x1ax00x00x00x00x00x00x00}x94(x8cx04namex94x8cx03cccx94x8cx03agex94Kx12u.'
    res = pickle.loads(b)
    print(res, type(res))  # {'name': 'ccc', 'age': 18} <class 'dict'>
    

    3.2 写入文件

    3.2.1 序列化

    import pickle
    dic = {'name': 'ccc', 'age': 18}
    with open('a.pkl', 'wb') as f:
        pickle.dump(dic, f)
    

    3.2.2 反序列化

    import pickle
    with open('a.pkl', 'rb') as f:
        res = pickle.load(f)
    print(res)  # {'name': 'ccc', 'age': 18}
    

    4 json与pickle比较

    json pickle
    通用格式,任何语言都有,都可以解析 仅python使用,转成b格式,其它语言识别不了
    字典、列表、布尔类型可用 任意数据类型都可用
    import json
    import pickle
    dic = {'a': input}
    res1 = json.dumps(dic)
    res2 = pickle.dumps(dic)
    print(res1)  # 报错,因为json只支持字典、列表和布尔
    print(res2)  # 转成b格式
    
    dic2 = pickle.loads(res2)
    dic2['a']()  # input()
    
  • 相关阅读:
    Codeforces Round #307 (Div. 2)E. GukiZ and GukiZiana
    bzoj2957: 楼房重建,分块
    分块入门。
    poj3690 Constellations
    Codeforces Round #451 (Div. 2)F. Restoring the Expression 字符串hash
    Codeforces Round #456 (Div. 2)D. Fishes
    Codeforces Round #450 (Div. 2)D. Unusual Sequences
    快速排序+分治法
    哈夫曼编码课程设计+最小优先对列建树。
    浅谈差分约束系统
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/14135884.html
Copyright © 2011-2022 走看看