zoukankan      html  css  js  c++  java
  • 模块进阶(二)

    1、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作为文件的后缀名

    下面举例说明:

    1、列表

    # 列表
    # list1 = ['123', '321']
    list1 = ['张全蛋', '李小花']
    # dumps: 将python数据 ---》 json数据格式 ---》 字符串
    # ensure_ascii将默认的ascii取消设置为False,可以在控制台看到中文,否则看到的是bytes类型数据
    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

    2、元组

    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

    3、字典

    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
    
    
    注意: 集合是不能被序列化成json
    set1 = {
        1, 2, 3, 4, 5
    }
    
    # dumps: 将python数据 ---》 json数据格式 ---》 字符串
    # ensure_ascii将默认的ascii取消设置为False,可以在控制台看到中文,否则看到的是bytes类型数据
    json_str = json.dumps(set1, 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
    注意: 集合是不能被序列化成json
    注册功能:
    import json
    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
    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))

    2、pickle 模块

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

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

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

    import pickle
    
    # set1 = {
    #     'tank', 'sean', 'jason', '大脸'
    # }
    #
    # # 写 dump
    # with open('teacher.pickle', 'wb') as f:
    #     pickle.dump(set1, f)
    
    
    # 读 load
    with open('teacher.pickle', 'rb') as f:
        python_set = pickle.load(f)
        print(python_set)
        print(type(python_set))

    3、collections 模块

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


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

    from collections import namedtuple

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

    - collections中提供了有序的字典

             from collections import OrderedDict

     具名元组:
    -具名元组只是一个元组

    from collections import namedtuple

    传入可迭代对象是有序的

    应用场景:坐标,游戏

    from collections import namedtuple
    point = namedtuple('坐标', ['x', 'y']) #第二个参数可以传入可迭代对象
    point = namedtuple('坐标',('x', 'y')) #第二个参数既可以传可迭代对像
    point = namedtuple('坐标','x y')#第二个参数既可以传可迭代对象
    from collections import namedtuple
    point = namedtuple('坐标',('x', 'y') )
    # 会将1传给x,2传给y
    p = point(1, 3)# 本质上传了4个
    print(p) # 坐标(x=1, y=3)
    # print(type(p)) #<class '__main__.坐标'>

    例:

    1)扑克牌:

    #获取扑克牌对象
    from collections import namedtuple
    card = namedtuple('扑克牌', ['color', 'number'])
    #由扑克牌对像产生一张扑克牌
    red_A = card('', 'A')
    print(red_A)
    black_K = card('', 'K')
    print(black_K)
    # 演员的信息
    from collections import namedtuple
    p = namedtuple('dao国', 'city movie_type name') #定义具名元组
    jason_and_dabing = p('大阪', 'action', '康老师')
    print(jason_and_dabing)

    2)有序字典:

    order_dict = OrderedDict({'x':1, 'y':2, "z":3})
    print(order_dict,'打印有序字典')      #OrderedDict([('x', 1), ('y', 2), ('z', 3)]) 打印有序字典
    print(type(order_dict))
    print(order_dict.get('y'))
    print(order_dict['y'])
    for line in order_dict:
        print(line)

    4、openpyxl 模块

    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
    wb_obj = Workbook()  #获取Excel文件对象
    wb1 = wb_obj.create_sheet('python工作表1', 1) #创建工作簿
    wb2 = wb_obj.create_sheet('python工作表2', 2)
    #修改工作表名字:为python工作表1标题修改名字---> 大宝贝
    print(wb1.title)
    wb1.title = '大宝贝'
    print(wb1.title)
    #为第一张工作表添加值
    #wb1['工作簿中的表格位置']
    wb1['A10'] = 200
    wb1['B10'] = 1000
    wb1['C10'] = '=SUM(A10:B10)'
    
    wb2['A1'] = 100
    wb_obj.save('python.xlsx')  #生成Excel表格
    print('excel表格生成成功')

    读取数据:

    # #读数据
    from openpyxl import load_workbook
    wb_obj = load_workbook('python.xlsx')  #
    print(wb_obj)
    #wb_obj['表名']
    wb1 = wb_obj['tank 大宝贝']
    print(wb1['A10'].value)
    wb1['A10'] = 20
    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

    字典类型:

    dict1 = {
        'name': 'tank',
        'age': 17
    }
    
    n = 1
    init_val = 65
    chr(65)  # 65-90
    for key, value in dict1.items():
        wb1['A%s' % n] = key
        wb1['B%s' % n] = value
        n += 1
    
    wb_obj.save('批量插入的数据.xlsx')

    5、subprocess 模块

    它是一个子进程模块,可以通过python代码给操作系统终端发送命令

    import subprocess
    while True:
        #让用户输入终端命命令
        cmd_str = input('请输入终端命令:').strip()
        '''
        Pooen(cmd命令, shell =True,
        stdout = subprocess.PIPE,strderr = subprocess.PIPE)
        调用Popen 就会将用户的终端命令发送给本地操作系统的终端
        得到一个对象,对象中包含着正确或错误的结果。
        '''
        obj = subprocess.Popen(
            cmd_str, shell=True,
            stdout=subprocess.PIPE,   #stdout:代表正确的结果
            stderr=subprocess.PIPE    #stderr:代表错误的结果
        )
        success = obj.stdout.read().decode('utf-8')  #得到正确结果
        if success:
            print(success, '正确的结果')
        error = obj.stderr.read().decode('gbk')   #得到错误结果
        if error:
            print(error, '错误的结果')
  • 相关阅读:
    为什么要使用href=”javascript:void(0);”
    切图要点
    css属性学习
    CentOS7使用yum安装RabbitMQ
    Linux下,root权限才能启动1024以下端口的程序
    Gitlab备份和恢复操作记录
    rpm批量卸载所有带有Java的文件
    如何使用微软官方工具制作win10启动盘
    重装系统时,将MBR分区转为GPT 分区
    walle 2.0 上线部署
  • 原文地址:https://www.cnblogs.com/xy-han/p/11894869.html
Copyright © 2011-2022 走看看