zoukankan      html  css  js  c++  java
  • json和pickle序列化模块

    序列化模块

    一、什么是序列化模块

    将python或者其他语言的数据类型转换成字符串类型

    序列:指的是字符串

    二、序列化与反序列化

    2.1 序列化:serializable

    将对象的状态信息转为可以存储或可以通过网络输的过程

    • 其他数据类型——>字符串——>文件中

    2.2 反序列化:

    从存储区域读取反序列化对象的状态,重新创建该对象

    • 文件中——>字符串——>其他数据类型

    三、实现序列化的两种模块

    3.1 json(第三方的)

    json是一个“第三方”的特殊数据格式
    python的Json模块序列化与反序列化的过程分别是 encoding和 decoding
    encoding:把一个Python对象编码转换成Json字符串
    decoding:把Json格式字符串解码转换成Python对象

    3.1.1 为什么要使用json

    为了让不同编程语言之间数据可以共享

    3.1.2 json的序列化流程

    序列化流程:

    python数据类型——>json数据类型——>字符串——>文件中

    ps:在json中,所有的字符串都是双引号

    反序列化流程:

    文件中——>字符串——>json数据类型——>python数据类型

    3.1.3 json的语法

    import json
     
    json.dumps(f.write())  # 序列化
    json.loads(f.read())  # 反序列化
    
    # 直接传入f的句柄,省略了f.write 
    json.dump(f)  # 序列化,并将数据内容写入文件,内部实现f.write()
    # 直接传入f的句柄,省略了f.read
    json.load(f)  # 反序列化,从文件中读取数据,内部实现f.read()
     
    # ps: 保存为json数据时,用.json作为文件的后缀名
    

    3.1.4 json的例子

    列表转换:

    import json
    # 给定一个列表
    list1 = ['123', '321']
    # ensure_ascii默认为True,改为False,可以在控制台看到中文,否则看到的是bytes类型数据
    json_str = json.dumps(list1, ensure_ascii=False)  # dumps,将列表序列化
    print(json_str)
    print(type(json_str))  # 是一个字符串类型
     
     
    ["123", "321"]
    <class 'str'>
    

    元组转换:

    import json
    tuple1 = ('张全蛋', '李小花')
     
    json_str = json.dumps(tuple1, ensure_ascii=False)
    print(json_str)
    print(type(json_str))
     
     
    ["张全蛋", "李小花"]
    <class 'str'>
    

    字典转换:

    import json
    dic1 = {
        'name': 'tank',
        'age': 17
    }
     
    json_str = json.dumps(dic1, ensure_ascii=False)
    print(json_str)
    print(type(json_str))
     
     
     
    {"name": "tank", "age": 17}
    <class 'str'>
    

    反序列化

    import json
    dic1 = {
        'name': 'tank',
        'age': 17
    }
     
    json_str = json.dumps(dic1, ensure_ascii=False)
     
    python_data = json.loads(json_str)  # 将文件中的字符串读出来,并还原成字典
    print(python_data)
    print(type(python_data))
     
     
     
    {'name': 'tank', 'age': 17}
    <class 'dict'>
    

    3.1.5 注册功能

    以保证用户的信息是以字典的形式存入文件中

    import json
     
     
    def json_info():
        user_name = input('请输入用户名:').strip()
        if user_name.isalnum():
            while True:
                password = input('请输入密码:').strip()
                re_password = input('请再次输入密码确认:').strip()
                if password != re_password:
                    print('两次密码不一致!')
                    continue
                if password == re_password:
                    # 定义字典,用于后面传值
                    info_dic = {
                        'name': user_name,
                        'pwd': password
                    }
                    # 将字典序列化
                    json_str = json.dumps(info_dic, ensure_ascii=False)
                    # 注意: 保存json数据时,用.json作为文件的后缀名
                    with open('user.json', mode='a', encoding='UTF-8') as wf:
                        wf.write(json_str)
                    print('注册成功!')
                    break
     
        else:
            print('请输入数字或者字母!')
     
     
    json_info()
     
    

    3.1.6 dump和load

    import json
    user_dic = {
        'username': 'tank',
        'password': 123
    }
    f = open('user2.json', 'w', encoding='utf-8')
    json.dump(user_dic, f)
    f.close()
    
    with open('user3.json', 'w', encoding='utf-8') as f:
        json.dump(user_dic, f)
    
    with open('user3.json', 'r', encoding='utf-8') as f:
        user_dic = json.load(f)
        print(user_dic)
        print(type(user_dic))
    

    3.2 pickle(python的)

    3.2.1 什么是pickle模块

    pickle是一个python自带的序列化模块

    3.2.2 pickle模块的优缺点

    优点:

    • 可以支持python中所有的数据类型
    • 可以直接存“bytes类型”的数据,pickle存取速度更快

    缺点:(致命)

    • 只能支持python去使用,不能跨平台

    3.2.3 pickle模块的语法

      • pickle.dump()
      • pickle.load()

    3.2.4 pickle的例子

    写的例子

    import pickle
     
    set1 = {'tank', 'sean', 'json', '大饼'}
     
    # 写 dump
    # 文件的后缀应该是.pickle
    with open('teacher.pickle', 'wb') as wf:
        pickle.dump(set1, wf)
     
    

    读的例子

    import pickle
    with open('teacher.pickle', 'rb') as rf:
        python_set = pickle.load(rf)
        print(python_set)
    

    四、json和pickle对比

    json:
    优点:json可以跨平台,支持其他编程语言,
    缺点:支持python的基本数据类型(string、unicode、int、float、list、tuple、dict)
    pickle:
    优点:支持python全部的数据类型,包括对象,可以直接存“bytes类型”的数据,pickle存取速度更快
    缺点:不能跨平台,只支持python编程语言

  • 相关阅读:
    加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 1 The Two Fundamental Rules (1.5-1.6)
    加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 1 The Two Fundamental Rules (1.1-1.4)
    加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: FINAL
    加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 5 Window to a Wider World
    加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 4 Dependent Samples
    加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 3 One-sample and two-sample tests
    加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 2 Testing Statistical Hypotheses
    加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 1 Estimating unknown parameters
    求旋转数组的最小数字(剑指offer)
    Vue创建局部组件
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12144276.html
Copyright © 2011-2022 走看看