zoukankan      html  css  js  c++  java
  • 模块三(含有包)

    一.包

      包是一系列模块文件的结合体,表示形式就是一个文件夹。这个文件夹的内部通常会有一个__init__.py文件,包的本质还是一个模块。

      首次导入包:

        先产生一个执行文件的名称空间

          1.创建包下面的__init__.py文件的名称空间

          2.执行包下面的__init__.py文件中的代码,将产生的名字放入包下面的__init.pyt文件名称                            空间中

          3.在执行文件中拿到一个指向包下面的__init__.py文件名称空间的名字

    研究模块与包可以站在两个角度分析不同的问题

    1.模块的开发者

        1.当模块的功能特别多的情况下,应该分文件管理

        2.每个模块之间为了避免后期模块改名的问题,你可以使用相对导入(包里面的文件都应该是被导入的模块)

    2.模块的使用者

        1.你必须得将包所在的那个文件夹路径添加到system.path中(*******)

    python2与python3的区别

    python2如果要导入包,包下面必须要有__init__.py文件

    python3如果要导入包,包下面没有__init__.py文件也不会报错

    二.logging模块(日志模块)

    import logging
    
    logging.basicConfig(
        filename='access.log',
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        level=30,
    )
    logging.debug('debug日志')
    logging.info('info日志')
    logging.warning('warning日志')
    logging.error('error日志')
    logging.critical('critical日志')
    
    #生成了一个access.log文件

    上面看到的debug,info,warning,error,critical分为五个等级,从debug到critical越来越强

    logging模块有4个对象:

    1.logger对象:负责产生日志

    logger = logging.getLogger('转账记录')

    2.filiter对象:过滤日志(了解)

    3.handler对象:控制日志输出的位置(文件/终端)

    hd1 = logging.FileHandler('a1.log',encoding='utf-8')
    hd2 = logging.StreamHandler() #输出到终端

    4.formmater对象:规定日志内容的格式

    fm1 = logging.Formatter(
            fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S %p',
    )  #规定日志格式内容

    5.给logger对象绑定handler对象

    logger.addHandler(hd1)
    logger.addHandler(hd2)

    6.给handler绑定formmate对象

    hd1.setFormatter(fm1)
    hd2.setFormatter(fm1)

    7.设置日志等级

    logger.setLevel(20)

    8.记录日志

    logger.debug('Debug了Debug了')

    logging配置字典

    import os
    import logging.config
    
    # 定义三种日志输出格式 开始
    
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                      '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
    
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    
    
    
    # 定义日志输出格式 结束
    """
    下面的两个变量对应的值 需要你手动修改
    """
    logfile_dir = os.path.dirname(__file__)  # log文件的目录
    logfile_name = 'a3.log'  # log文件名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)
    # log配置字典
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},  # 过滤日志
        'handlers': {
            #打印到终端的日志
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
            #打印到文件的日志,收集info及以上的日志
            'default': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': logfile_path,  # 日志文件
                'maxBytes': 1024*1024*5,  # 日志大小 5M
                'backupCount': 5,
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
        },
        'loggers': {
            #logging.getLogger(__name__)拿到的logger配置
            '': {
                'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',
                'propagate': True,  # 向上(更高level的logger)传递
            },  # 当键不存在的情况下 默认都会使用该k:v配置
        },
    }
    
    
    # 使用日志字典配置
    logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
    logger1 = logging.getLogger('asajdjdskaj')
    logger1.debug('好好的 不要浮躁 努力就有收获')

    三.hashlib模块(加密模块)

    import hashlib  # 这个加密的过程是无法解密的
    md = hashlib.sha3_256()  # 生成一个帮你造密文的对象
    md.update('hello'.encode('utf-8'))  # 往对象里传明文数据  update只能接受bytes类型的数据
    md.update(b'Jason_@.')  # 往对象里传明文数据  update只能接受bytes类型的数据
    print(md.hexdigest())  # 获取明文数据对应的密文

    密文的长度越长 内部对应的算法越复杂但是
      1.时间消耗越长
      2.占用空间更大
    通常情况下使用md5算法 就可以足够了

    hashlib模块应用场景
    1.密码的密文存储
    2.校验文件内容是否一致

    四.openpyxl

    from openpyxl import Workbook
    
    
    wb = Workbook()  # 先生成一个工作簿
    wb1 = wb.create_sheet('index',0)  # 创建一个表单页  后面可以通过数字控制位置
    wb2 = wb.create_sheet('index1')
    wb1.title = 'login'  # 后期可以通过表单页对象点title修改表单页名称
    
    wb1['A3'] = 666
    wb1['A4'] = 444
    wb1.cell(row=6,column=3,value=88888888)
    wb1['A5'] = '=sum(A3:A4)'
    
    wb2['G6'] = 999
    wb1.append(['username','age','hobby'])
    wb1.append(['jason',18,'study'])
    wb1.append(['tank',72,'吃生蚝'])
    wb1.append(['egon',84,'女教练'])
    wb1.append(['sean',23,'会所'])
    wb1.append(['nick',28,])
    wb1.append(['nick','','秃头'])
    
    
    wb.save('test.xlsx')
    
    
    from openpyxl import load_workbook  # 读文件
    
    
    wb = load_workbook('test.xlsx',read_only=True,data_only=True)
    print(wb)
    print(wb.sheetnames)  # ['login', 'Sheet', 'index1']
    print(wb['login']['A3'].value)
    print(wb['login']['A4'].value)
    print(wb['login']['A5'].value)  # 通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
    
    res = wb['login']
    # print(res)
    ge1 = res.rows
    for i in ge1:
        for j in i:
            print(j.value)

     

    万般皆下品,唯有读书高!
  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11216142.html
Copyright © 2011-2022 走看看