zoukankan      html  css  js  c++  java
  • 模块二之序列化模块以及collections模块

    模块二之序列化模块以及collections模块

    一、序列化模块

    • json模块
    '''
    序列化:将python或其他语言的数据类型转换成字符串类型
    json模块: 是一个序列化模块。
        json:
            是一个 “第三方” 的特殊数据格式。
    
            可以将python数据类型 ----》 json数据格式 ----》 字符串 ----》 文件中
    
            其他语言要想使用python的数据:
                文件中 ----》 字符串 ----》 json数据格式 ----》 其他语言的数据类型。
    
            注意: 在json中,所有的字符串都是双引号
    
            # 元组比较特殊:
            python中的元组,若将其转换成json数据,内部会将元组 ---> 列表(变成可变类型)
    
            # set是不能转换成json数据
    
    为什么要使用json:
        - 为了让不同的语言之间数据可以共享。
    
        PS: 由于各种语言的数据类型不一,但长相可以一样,
        比如python不能直接使用其他语言的数据类型,
        必须将其他语言的数据类型转换成json数据格式,
        python获取到json数据后可以将json转换成pyton的数据类型。
    
    如何使用:
        import json
    
        - json.dumps:
        json.dumps(), f = open() --> f.write()
            # 序列化: python数据类型 ---》 json ---》 字符串 ---》 json文件中
    
        - json.loads:
        f = open(), str = f.read(),  json.loads(str)
            # 反序列化: json文件中 --》  字符串 ---》 json ---》 python或其他语言数据类型
    
        - json.dump():  # 序列化: python数据类型 ---》 json ---》 字符串 ---》 json文件中
            - 内部实现 f.write()
    
        - json.load():  # 反序列化: json文件中 --》  字符串 ---》 json ---》 python或其他语言数据类型
            - 内部实现 f.read()
    
        - dump, load: 使用更方便
    
    注意: 保存json数据时,用.json作为文件的后缀名
    '''
    
    import json
    
    #列表
    list = ['亚峰', '小明', '热巴']
    #dumps是序列化:将python数据(或其他语言)---->json数据格式------>字符串
    #ensure_ascii默认是True
    json_str = json.dumps(list)
    print(json_str)
    >>>["u4e9au5cf0", "u5c0fu660e", "u70edu5df4"]
    #
    #
    #ensure_ascii=Falise可通过这种方式实现原有的样子
    json_str = json.dumps(list, ensure_ascii=False)
    print(json_str)
    >>>["亚峰", "小明", "热巴"]
    print(type(json_str))
    >>><class 'str'>
    #
    #
    #loads是反序列化:字符串----->json数据格式------->python数据(其他语言)
    python_data = json.loads(json_str)
    print(python_data)
    >>>['亚峰', '小明', '热巴']
    print(type(python_data))
    >>><class 'list'>
    
    
    #元祖
    tuple1 = ('亚峰', '小明', '热巴')
    json_str = json.dumps(tuple1)
    print(json_str)
    >>>["u4e9au5cf0", "u5c0fu660e", "u70edu5df4"]
    json_str = json.dumps(tuple1, ensure_ascii=False)
    print(json_str)
    >>>["亚峰", "小明", "热巴"]在json中""代表字符串
    print(type(json_str))
    >>><class 'str'>
    #
    python_data = json.loads(json_str)
    print(python_data)
    >>>['亚峰', '小明', '热巴']
    print(type(python_data))
    >>><class 'list'>
    #
    #
    #字典
    dic = {
         'name': 'yafeng',
         'age': '18'
     }
    json_str = json.dumps(dic)
    print(json_str)
    >>>{"name": "yafeng", "age": "18"}
    print(type(json_str))
    >>><class 'str'>
    json_str = json.dumps(dic, ensure_ascii=False)
    print(json_str)
    >>>{"name": "yafeng", "age": "18"}
    #
    #
    python_obj = json.loads(json_str)
    print(python_data)
    >>>['亚峰', '小明', '热巴']
    print(type(python_data))
    >>>['亚峰', '小明', '热巴']
    #
    #
    # #****注意集合是不能被序列化成json****
    set1 = {1, 2, 3, 4}
    json_str = json.dumps(set1)
    print(json_str)
    >>>TypeError: Object of type set is not JSON
    >>>serializable(序列化)
    
    
    #注册功能
    # def register():
    #     username = input('请输入您的姓名:').strip()
    #     password = input('请输入您的密码:').strip()
    #     re_password = input('请确认您的密码:').strip()
    #     if password == re_password:
    #         user_dic = {
    #             'name': 'username',
    #             'pwd': 'password'
    #         }
    #         json_str = json.dumps(user_dic, ensure_ascii=False)
    #
    #         #开始写入文件
    #         #保存json数据时,用.json做后缀
    #         with open('user.json','w',encoding='utf-8')as f:
    #             f.write(json_str)
    #
    # register()
    
    
    #dump,load的用法
    import json
    
    user_dic = {
        'name': 'yafeng',
        'age': 18
    }
    with open('user1.json', 'w', encoding='utf-8')as f:
        json.dump(user_dic, f)#先open,在write
    
    with open('user2.json', 'w', encoding='utf-8')as f:
        json.dump(user_dic, f)
    
    with open('user2.json', 'r', encoding='utf-8')as f:
        user_dic = json.load(f)
        print(user_dic)
        print(type(user_dic))
        #>>>{'name': 'yafeng', 'age': 18}
        #>>><class 'dict'>
    
    
    
    • pickle模块
    '''
    pickle模块:
        pickle是一个python自带的序列化模块。
    
        优点:
            - 可以支持python中所有的数据类型(集合也行)
            - 可以直接存 "bytes类型" 的数据,pickle存取速度更快
    
        缺点: (致命的缺点)
            - 只能支持python去使用,不能跨平台
    '''
    import pickle
    
    dic = {
        'name': 'yafeng',
        'age': '18',
        'love': '热巴'
    }
    
    #转换成序列化dump(bytes)
    with open('yafeng.pickle', 'wb')as f:
        pickle.dump(dic, f)
    
    #读换成原来的
    with open('yafeng.pickle', 'rb')as f:
        python_dic = pickle.load(f)#注意load只能加载一个对象
        print(python_dic)
        #>>>{'name': 'yafeng', 'age': '18', 'love': '热巴'}
        print(type(python_dic))
        #>>><class 'dict'>
    
    
    set1 = {'yafeng', '18', '热巴'}
    with open('1.pickle', 'wb')as f:
        pickle.dump(set1, f)
    
    with open('1.pickle', 'rb')as f:
        python_set = pickle.load(f)
        print(python_set)
        #>>>{'18', '热巴', 'yafeng'}
        print(type(python_set))
        #>>><class 'set'>
    
    
    
    

    二、collections 模块

    • 具名元组
    '''
    - python默认八大数据:
                - 整型
                - 浮点型
                - 字符串
                - 字典
                - 元组
                - 列表
                - 集合
                - 布尔
    collections模块:
        - 提供一些python八大数据类型 “以外的数据类型” 。
    
    
        - 具名元组:
            具名元组 只是一个名字。
            应用场景:
                - 坐标
                -
    
            from collections import namedtuple
    
        - 有序字典:
            - python中字典默认是无序
    
            - collections中提供了有序的字典
    
            from collections import OrderedDict
    
    '''
    
    #具名元组
    
    from collections import namedtuple
    
    #传入的可迭代对象是有序的即可索引取值(比如列表,元组,字符串)
    
    #应用1:坐标
    #将‘坐标’变成‘对象’的名字
    point = namedtuple('坐标', ['x', 'y'])#此时的第二个参数既可以传可迭代对象
    point = namedtuple('坐标', ('x', 'y'))#此时的第二个参数既可以传可迭代对象
    point = namedtuple('坐标', 'x y')#此时的第二个参数既可以传可迭代对象,注意字符串中的每个元素之间必须以空格隔开
    
    #传参的个数要与第二个参数的个数一致
    p = point(1, 2)
    print(p)
    #坐标(x=1, y=2)
    print(type(p))
    #<class '__main__.坐标'>
    
    
    #应用2、扑克牌
    #获取扑克牌对象
    card = namedtuple('扑克牌', ['color', 'number'])#此时就是扑克牌对象
    
    #由扑克牌对象产生一张 扑克牌
    red_A = card('❤', 'A')
    print(red_A)
    #>>>扑克牌(color='❤', number='A')
    print(type(red_A))
    #>>><class '__main__.扑克牌'>
    
    black_k = card('♠', 'K')
    print(black_k)
    #>>>扑克牌(color='♠', number='K')
    print(type(black_k))
    #>>><class '__main__.扑克牌'>
    
    #应用3、影片的信息
    p = namedtuple('岛国', ['city', 'movie_type', 'name'])
    movie_info = p('东京', '爱情动作片', 'cang老师')
    print(movie_info)
    #>>>岛国(city='东京', movie_type='爱情动作片', name='cang老师')
    print(type(movie_info))
    #>>><class '__main__.岛国'>
    
    
    #2、有序字典
    #python中默认字典是无序的*****很重要******
    
    dic = {
        'name': 'yafeng',
        'age': 18,
        'love': '热巴'
    }
    print(dic)
    #>>>{'name': 'yafeng', 'age': 18, 'love': '热巴'}
    print(type(dic))
    #>>><class 'dict'>
    for i in dic:
        print(i)
        #>>>name
        #>>>age
        #>>>love
    
    
    #有序字典
    from collections import OrderedDict
    
    order_dic = OrderedDict(dic)
    print(order_dic)
    #>>>OrderedDict([('name', 'yafeng'), ('age', 18), ('love', '热巴')])
    print(type(order_dic))
    #>>><class 'collections.OrderedDict'>
    
    print(order_dic.get('love'))
    #>>>热巴
    print(order_dic['love'])
    #>>>热巴
    
    for i in order_dic:
        print(i)
        #name
        #age
        #love
    
    
    

    三、openpyxl模块

    • openpyxl(可对ecxel表格进行操作的模块)
    # '''
    # openpyxl模块:第三方模块
    #     - 可以对Excle表格进行操作的模块
    #
    #     - 下载:
    #         pip install openpyxl
    #
    #     - Excel版本:
    #         2003之前:
    #             excle名字.xls
    #
    #         2003以后:
    #             excle名字.xlsx
    #
    #     - 清华源: https://pypi.tuna.tsinghua.edu.cn/simple
    #
    #     - 配置永久第三方源:
    #         D:C:Users占亚峰AppDataLocalProgramsPythonPython37Libsite-packagespip\_internalmodelsindex.py
    # '''
    
    # #写入数据
    # from openpyxl import Workbook
    #
    # #获取Excel文件对象
    # wb_obj = Workbook()
    #
    # wb1 = wb_obj.create_sheet('亚峰牛皮1', 1)
    # wb2 = wb_obj.create_sheet('亚峰牛皮2', 2)
    #
    # #修改工作表名字,将'亚峰牛皮2'修改成---->'亚峰666'
    # print(wb2.title)
    # wb2.title = '亚峰666'
    # print(wb2.title)
    #
    #
    # #为第一张工作表中添加值
    # #wb1['工作簿中的表格位置']
    # wb1['A10'] = 123
    # wb1['B10'] = 666
    # wb1['C10'] = '=SUM(A10:B10)'
    #
    # #生成Excel表格
    # wb_obj.save('亚峰牛皮1.xlsx')
    # print('excel表格生成成功')
    
    
    # #读取数据
    # from openpyxl import load_workbook
    # wb_obj = load_workbook('亚峰1.xlsx')
    # print(wb_obj)
    #
    # #wb_obj['表名']
    # wb1 = wb_obj['亚峰牛皮1']
    # print(wb1['A10'].value)
    # wb1['A10'] = 666
    # print(wb1['A10'].value)
    
    
    #批量写入100条数据
    from openpyxl import Workbook
    
    wb_obj = Workbook()
    
    wb1 = wb_obj.create_sheet('工作表1')
    
    #wb1['表的位置'] = '对应的值'
    # n = 1
    # for line in range(100):
    #     wb1['A%s' %n] = line + 1
    #     n += 1
    
    
    #假设:一万条数据的字典
    dic = {
        'name': '亚峰',
        'age': 18,
        'love': '热巴'
    }
    
    n = 1
    for key, value in dic.items():
        wb1['A%s' %n] = key
        wb1['B%s' %n] = value
        n += 1
    
    wb_obj.save('批量插入的数据.xlsx')
    
    
    
  • 相关阅读:
    20位活跃在Github上的国内技术大牛
    ubuntu下安装ros出现“无法下载-package.ros.org中某个包-校验和不符”的解决方法
    从ROS bag文件中提取图像
    计算机视觉、机器学习相关领域论文和源代码大集合
    使用XV-11激光雷达做hector_slam
    机器人操作系统(ROS)教程22:ROS的3D可视化工具—rviz
    ROS探索总结(三)——ROS新手教程
    bootstrap文件上传C#实现
    .net分流抢票助手
    谷歌浏览器整个网页截图方法
  • 原文地址:https://www.cnblogs.com/yafeng666/p/11883607.html
Copyright © 2011-2022 走看看