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

    一、json和pickle模块

    要说json和pickle首先要说序列化

    1.1 序列化

    把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening。

    序列化的优点:

    1. 持久保存状态:内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。但是在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
    2. 跨平台数据交互:序列化时不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

    json模块

    json序列化并不是python独有的,json序列化在java等语言中也会涉及到,因此使用json序列化能够达到跨平台传输数据的目的

    json数据类型和python数据类型对应关系表

    Json类型 Python类型
    {} dict
    [] list
    "string" str
    520.13 int或float
    true/false True/False
    null None

    json模块序列化和反序列化的一个过程如下图所示

    json模块

    使用json模块

    import json

    序列化:从python的字典(最常用)变成json串. dump方法

    反序列化:从json串变成python的字典(最常用),load方法

    序列化到内存中

    # 序列化到内存中
    dic = {'a': 1, 'b': 'abc', 'c': None}
    data = json.dumps(dic)  # 序列化到内存中
    print(data,type(data))  # 单引号全部变成双引号
    
    data = json.loads(data)  # 反序列化 从内存中获取json串
    print(data,type(data))
    

    {"a": 1, "b": "abc", "c": null} <class 'str'>
    {'a': 1, 'b': 'abc', 'c': None} <class 'dict'>

    序列化到文件中

    # 序列化到文件中
    dic = {'a': 1, 'b': 'abc', 'c': None}
    with open('47 json.json','w',encoding='utf8') as fw:         # 写文件
        json.dump(dic,fw)   # 序列化到文件,以二进制存储
    
    with open(f'{"47 json"}.json','r',encoding='utf8') as fr:    # 读文件
        data = json.load(fr) # 反序列化
    print(data,type(data))
    

    {'a': 1, 'b': 'abc', 'c': None} <class 'dict'>

    pickle模块

    Pickle序列化和所有其他编程语言特有的序列化问题一样,它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,即不能成功地反序列化也没关系。但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不可以

    pickle模块序列化和反序列化的过程如下图所示

    pickle模块

    使用pickle模块

    import pickle

    序列化: dump方法

    反序列化:load方法

    序列化到内存中

    # 序列化到内存中
    dic = {'a': 1, 'b': 'abc', 'c': None}
    data = pickle.dumps(dic)   # 序列化到内存,以二进制存储
    print(data, type(data))
    
    data = pickle.loads(data)   # 反序列化回来.字典
    print(data, type(data))
    

    b'x80x03}qx00(Xx01x00x00x00aqx01Kx01Xx01x00x00x00bqx02Xx03x00x00x00abcqx03Xx01x00x00x00cqx04Nu.' <class 'bytes'>
    {'a': 1, 'b': 'abc', 'c': None} <class 'dict'>

    序列化到文件中

    # 序列化到文件中
    dic = {'a': 1, 'b': 'abc', 'c': None}
    with open('47 pickle.txt', 'wb') as fw:
        pickle.dump(dic, fw)    # 序列化到文件,以二进制存储
    
    # 反序列化
    with open('47 pickle.txt', 'rb') as fr:
        data = pickle.load(fr) # 反序列化
    print(data)
    
  • 相关阅读:
    SpringBoot学习笔记(14)----应用监控-HTTP方式
    SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群
    SpringBoot学习笔记(12)----SpringBoot实现多个 账号轮询发送邮件
    SpringBoot学习笔记(11)-----SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
    SpringBoot学习笔记(8)-----SpringBoot文件上传
    SpringBoot学习笔记(7)-----CORS支持解决跨域问题
    设计模式:迭代器模式(Iterator)
    设计模式:适配器模式(Adapter)
    设计模式:状态模式(State)
    设计模式:抽象工厂模式(Abstract Factory)
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11366728.html
Copyright © 2011-2022 走看看