zoukankan      html  css  js  c++  java
  • python基础语法12 内置模块 json,pickle,collections,openpyxl模块

    json模块

    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
    # list1 = ['123', '321']
    list1 = ['张全蛋', '李小花']
    # dumps: 将python数据 ---》 json数据格式 ---》 字符串
    # ensure_ascii将默认的ascii取消设置为False,可以在控制台看到中文,否则看到的是bytes类型数据    默认ascii,本质上是中文字符转化为unicode编码
    json_str = json.dumps(list1, ensure_ascii=False)
    print(json_str)
    print(type(json_str))  # str
    
    # json.loads()字符串 ----> json数据格式 ---》将python数据
    python_data = json.loads(json_str)
    print(python_data)
    print(type(python_data))  # list
    --------------------------------------
    # 元组
    tuple1 = ('张全蛋', '李小花')
    # dumps: 将python数据 ---》 json数据格式 ---》 字符串
    # ensure_ascii将默认的ascii取消设置为False,可以在控制台看到中文,否则看到的是bytes类型数据
    json_str = json.dumps(tuple1, ensure_ascii=False)
    print(json_str)
    print(type(json_str))  # str
    
    # json.loads()字符串 ----> json数据格式 ---》将python数据
    python_data = json.loads(json_str)
    print(tuple(python_data))
    print(type(tuple(python_data)))  # list
    --------------------------------------
    # 字典
    dic = {
        'name': 'tank',
        'age': 17
    }
    
    # dumps: 将python数据 ---》 json数据格式 ---》 字符串
    # ensure_ascii将默认的ascii取消设置为False,可以在控制台看到中文,否则看到的是bytes类型数据
    json_str = json.dumps(dic, ensure_ascii=False)
    print(json_str)
    print(type(json_str))  # str
    
    # json.loads()字符串 ----> json数据格式 ---》将python数据
    python_data = json.loads(json_str)
    print(python_data)
    print(type(python_data))  # dict

    注册功能

    # 注册功能:
    def register():
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        re_password = input('请确认密码:').strip()
        if password == re_password:
            # [username, password]
            # {'name': username, 'pwd': 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方法可省略f.write(),f.read()步骤

    # dump, load
    import json
    user_dic = {
        'username': 'tank',
        'password': 123
    }
    f = open('user2.json', 'w', encoding='utf-8')
    json.dump(user_dic, f,ensure_ascii=False)   
    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))

    pickle模块:

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

      优点:
        - 可以支持python中所有的数据类型
        - 可以直接存 "bytes类型" 的数据,pickle存取速度更快

      缺点: (致命的缺点)
        - 只能支持python去使用,不能跨平台

    import pickle
    set1 = {
        'tank', 'sean', 'jason', '大脸'
    }
    new_str= pickle.dumps(set1)
    print(new_str) # 打印为二进制结果
    '''打印结果
    b'x80x03cbuiltins
    set
    qx00]qx01(Xx04x00x00x00tankqx02Xx06x00x00x00xe5xa4xa7xe8x84
     xb8qx03Xx05x00x00x00jasonqx04Xx04x00x00x00seanqx05ex85qx06Rqx07.'
    '''
    # 写 dump
    with open('teache.pickle','wb')as f:  # 必须为二进制读写
        pickle.dump(set1,f)
    
    # 读 load
    with open('teache.pickle','rb')as f:
        python_set=pickle.load(f)
        print(python_set)
        print(type(python_set))

    - python默认八大数据:
      - 整型
      - 浮点型
      - 字符串
      - 字典
      - 元组
      - 列表
      - 集合
      - 布尔
    collections模块:
      - 提供一些python八大数据类型 “以外的数据类型” 。


      - 具名元组:
        具名元组 只是一个名字。
        应用场景:
          - 坐标

        from collections import namedtuple

      - 有序字典:
        - python中字典默认是无序

        - collections中提供了有序的字典

        from collections import OrderedDict

    # 具名元组
    from collections import namedtuple
    
    # 传入可迭代对象是有序的
    # 应用:坐标
    # 将'坐标'变成 “对象” 的名字
    point = namedtuple('坐标', ['x', 'y'])  # 第二个参数既可以传可迭代对象
    point = namedtuple('坐标', ('x', 'y'))  # 第二个参数既可以传可迭代对象
    point = namedtuple('坐标', 'x y')  # 第二个参数既可以传可迭代对象
    #
    # # 会将 1 ---> x,   2 ---> y
    # 传参的个数,要与namedtuple第二个参数的个数一一对应
    p = point(1, 3)  # 本质上传了4个,面向对象讲解
    print(p)    # 坐标(x=1, y=3)
    print(type(p))  # <class '__main__.坐标'>
    
    
    # 扑克牌:
    # 获取扑克牌对象
    card = namedtuple('扑克牌',  ['color', 'number'])
    #
    # # 由扑克牌对象产生一张 扑克牌
    red_A = card('', 'A')  # 扑克牌(color='♥', number='A')
    print(red_A)
    black_K = card('', 'K') # 扑克牌(color='♠', number='K')
    print(black_K)
    
    # 演员的信息
    p = namedtuple('dao国', 'city movie_type name')
    jason_and_dabing = p('大阪', 'action', 'C老师')
    print(jason_and_dabing)
    # dao国(city='大阪', movie_type='action', name='C老师')
    # 有序字典
    # python默认无序字典
    dic = dict({'x': 1, 'y': 2, 'z': 3})
    print(dic)
    print(type(dic))
    for line in dic:
        print(line)
    
    
    from collections import OrderedDict
    # 有序字典
    order_dict = OrderedDict({'x': 1, 'y': 2, 'z': 3})
    print(order_dict, '打印有序的字典')
    print(type(order_dict))
    print(order_dict.get('y'))
    print(order_dict['y'])
    
    for line in order_dict:
        print(line)

    openpyxl模块

      - 可以对Excle表格进行操作的模块

      - 下载:
        pip3 install openpyxl

      - Excel版本:
        2003之前:
          excle名字.xls

        2003以后:
          excle名字.xlsx

      - 清华源: https://pypi.tuna.tsinghua.edu.cn/simple

      - 配置永久第三方源:
        D:Python36Libsite-packagespip\_internalmodelsindex.py

    # 写入数据
    from openpyxl import Workbook
    # 获取Excel文件对象
    wb_obj = Workbook()
    
    wb1 = wb_obj.create_sheet('python13期工作表1', 1)
    wb2 = wb_obj.create_sheet('python13期工作表2', 2)
    
    # 修改工作表名字: 为python13期工作表1标题修改名字 ---》 tank大宝贝
    print(wb1.title)
    wb1.title = 'tank大宝贝'
    print(wb1.title)
    
    # 为第一张工作表添加值
    wb1['工作簿中的表格位置']
    wb1['A10'] = 200
    wb1['B10'] = 1000
    wb1['C10'] = '=SUM(A10:B10)'
    
    
    wb2['A1'] = 100
    
    # 生成Excel表格
    wb_obj.save('python13期.xlsx')
    print('excel表格生成成功')
    
    
    # 读取数据
    from openpyxl import load_workbook
    wb_obj = load_workbook('python13期.xlsx')
    wb3=wb_obj.creat_sheet('python13期工作表3',3)
    # print(wb3.title)
    # wb3.title='tank小宝贝' #修改会再创建一个tank小宝贝的sheet,存在问题
    # print(wb3.title)
    print(wb_obj) # wb_obj['表名'] wb1 = wb_obj['tank大宝贝']
    print(wb1['A10'].value) wb1['A10'] = 20 print(wb1['A10'].value) wb_obj.save('python13期.xlsx') # 加这一步才会保存
    # 批量写入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
        
    wb_obj.save('批量插入的数据2.xlsx')
    dict1 = {
        'name': 'tank',
        'age': 17
    }
    n=1
    for key,value in dict1.items():
        wb1['A%s'%n]=key
        wb1['B%s' % n] = value
        n+=1
    wb_obj.save('批量插入的数据2.xlsx')
  • 相关阅读:
    sqlserver中实现split分割字符串函数
    Sqlserver判断对象是否存在
    C#学习笔记(十):阴影和深度复制 [转]
    C#企业库自定义连接字符串.
    Jquery error 事件
    SQLserver不是可以识别的内置函数名称"的错误,通过set statistics time on能得到SQL语句的执行时间精确到毫秒.
    C#学习笔记(九):c#运算符重载.[简单理解]
    利用sql语句添加字段注释
    如何抓取google的搜索结果?
    SQL SERVER级联删除的简单实现方法
  • 原文地址:https://www.cnblogs.com/ludingchao/p/11883657.html
Copyright © 2011-2022 走看看