• 常用模块 二


      一、包

       1.1 研究模块与包。还可以站在另外角度分析不同的问题

        1.模块的开发者

        2.模块的使用者

        一系列模块文件夹的结合体,改文件内部通常会有一个__init__.py 文件

        包的本质还是一个还是一个模块

           1.2  from dir.dir1 import p  

        首次导入包:
         先产生一个执行文件的名称空间。
         1.创建包下面的__init__.py 文件的名称空间
         2.执行包下面的————init__.py文件中的代码 将产生的名字放入__init__.py的名称空间中
         3.在执行的文件中拿到一个执行包下面的__init__.py文件的名称空间的名字

       1.3 在导入语句中. 号左边肯定是一个包(文件夹)
        
       1.4 为什么要创建包(文件夹会执行创————init__.py文件)
          
     当模块的功能作为包的设计者来说
        
        1、当模块的功能特别多的时候,应该分文件管理,结构清晰
        
        2、每个模块之间为了避免后期模块改名的问题,你可以使用相对导入点点语法(包的文件都应该是被导入的模块)
        
        
    站在包的开发者 如果使用的是绝对路径来管理自己的模块,那么它只需要永远以包的路径为依据导入模块
    
    站在使用者的角度 必须将包的所在的那个文件接路径添加到system path 中

       1.5  python2 和 python3 在包的区别

        python2 中要导入包必须要有__init__.py文件

        python3 中如果要导包 包下可以没有__init__.py 文件 也不会报错

        注意:当你在删除程序不要的文件,千万不要随意删除__init__.py文件 即使为空

      二、logging模块

    # 函数式简单配置
    """
    import logging
    logging.debug('debug message日志')  #等级10
    logging.info('info message日志')  #  等级20
    logging.warning('warning message')  # 等级30
    logging.error('error message')  # 等40
    logging.critical('critical message')  # 等级50
    """
    # 灵活配置日志级别、日志格式、输出位置
    """
    import logging  # d导入logging 模块
    file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        handlers=[file_handler,],
        level=logging.ERROR
    )
    
    logging.error('你好')
    
    """
    # 1.日志分为五个等级: 类似于地震的强度
    
    
    
    """
    
    import logging  模块
    logging.debug('debug message日志')  #等级10
    1.debug 日志:为第一级可以人为的设定等级数>>>10
    
    logging.info('info message日志')  #  等级20
    2.info 日志:为第二级 设置为20  
    logging.warning('warning message')  # 等级30
    
    3.warning 日志:为第三级 设置为30 
    logging.error('error message')  # 等40 
    
    4.error 日志:40
    logging.critical('critical message')  # 等级50
    5.critical 日志:50  记录日志是可以设置的内容的 你设置在那一层就会从那一层开始上记录
    
    """
    
    # 2. 四个对象:
    """
    1.logger 对象>>>产生日志的
    2.filter 对象>>>过滤日志
    3.handler 对象>>>控制台指定文件输入的位置:输出的位置是文件还是中端。
    4.formmater 对象>>> 按照什么格式进行输出的:
    """
    
    
    # 一、写日志
    # 1.logger对象:负责产生日志:
    import logging
    logger = logging.getLogger('转账明细:')
    
    # 2.2.filter 对象>>>过滤日志 了解
    
    # 3.handler(输出位置文件/终端)
    
    handler1 = logging.FileHandler('a1.log',encoding='utf-8')  # 控制台指定的输出的位置:文件a1
    handler2 = logging.FileHandler('a2.log',encoding='utf-8')  # 控制台指定的输出的位置:文件a2
    handler3 = 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')
    
    fm2 = logging.Formatter(
        fmt='%(asctime)s - %(name)s:  %(message)s',
        datefmt='%Y-%m-%d')
    
    # 5.给logger对象绑定(添加)handler 对象
    logger.addHandler(handler1)  #
    logger.addHandler(handler2)  #
    logger.addHandler(handler3)  #
    
    # 6.给handler 绑定formmater对象、
    handler1.setFormatter(fm1)
    handler2.setFormatter(fm2)
    handler3.setFormatter(fm1)
    
    # 7.设置日志等级
    logger.setLevel(10)
    
    # 8.记录日志:起始
    logger.info('手撸日志 累死了啊')
     

       logging 日志配置字典

      三、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配置
        },
    }

    # 日志调用 common

    # 使用日志字典配置 后期将用函数封装 导入common 生成logger对象
    logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
    logger1 = logging.getLogger('asajdjdskaj')
    logger1.debug('好好的 不要浮躁 努力就有收获')

      四、hasblib模块

      import hashlib

      # 生成个md5对象

      md = hashlib()
      # 加盐

      md.update(’都可以加的内容')

      md.update('再加点盐')

      md.hexdigest()

      print(md.hexdigest())

      

    import hashlib
    import hashlib

    def get_md5(data):
    md = hashlib.md5()

    md.update('都可以加的内容'.encode('utf-8'))

    md.update(data.encode('utf-8'))
    return md.hexdigest()

    # 函数调用:

    password = input('输入密码:').strip()

    res1 = get_md5(password)

    print(res1)

      五、openpyxl模块

    # openpyxl 比较火的操作excel表格的模块
    """
    03版本之前 excel文件的后缀名 叫xls
    03版本之后 excel文件的后缀名 叫xlsx
    
    xlwd  写excel
    xlrt  读excel
    
    xlwd和xlrt既支持03版本之前的excel文件也支持03版本之后的excel文件
    openpyxl 只支持03版本之后的  xlsx
    """

      

    # 1.写excel 表格
    from openpyxl import Workbook
    首先生成一个工作薄
    wb = Workbook() 
    2.创建一个表单页 后面可以通过数字控制位置
    wb1 = wb.create_sheet('表格一',0)  # 创建一个表单页 后面可以通过数字控制位置
    wb2 = wb.create_sheet('表格二',1)  # 创建一个表单页 后面可以通过数字控制位置

      3. 更改表单页的名字

    wb1.title = 'login日志'  # 更改表单页的名字
    wb2.title = '流水日志'  # 可以通过wb2.title更改表单页名字

      4..可以指定按表格填写内容

    # wb1 ['A3'] = 1000
    # wb1 ['A4'] = 999
    # wb1 ['A5'] = '=sum(A3:A4)'  #求和
    
    # 可以指定的行和列中写
    # wb1.cell(row=6,column=3,value=9999)  #

      5.创建一个表头

    # 4.创建一个表头
    # wb1.append(['username','age','hobby'])
    # # 给表格写点内容
    # wb1.append(['coco',18,'dancing'])
    # wb1.append(['yy',26,'we'])
    # wb1.append(['jason',19,'开车'])
    # wb1.append(['tank',18,'生蚝'])
    #
    最重要的是保存: 保存新建的excel 文件 wb.save('today1.xlsx')  # 先创建一个表格文件

    # 1.写 from openpyxl import wordbook

    wd = workbook()   # 生成一个工作薄对象

    1.出创建表单页:

      wb1 = wb.create_sheet(参数一是表单页名',0是可以控制位置)

    2.改 表单页的名字

    wb1.title = ‘lgoin 日志’

    #2.wb.save()

    3.写内容:操作生成的表单页对象 指定位置填写

    4.创建表头

    # 操作表单页对象wb1.append([]) 写的时候一一对应

    二、读.读取表格内容

    from openpyxl import load_workbook  # 导入读取
    wb = load_workbook('today1.xlsx',read_only=True,data_only=True)
    print(wb.sheetnames)  # 拿到表里面的名子
    # ['login日志', '流水日志', 'Sheet']
    print(wb['login日志']['C3'].value)
    
    res = wb['login日志']
    print(res)
    w = res.rows
    for i in res.rows:
        print(i)  #  <ReadOnlyCell 'login日志'.C5>
        for j in i:
            print(j.value)
        print()
            # username
            # age
            # hobby
    
             # coco
             # 18
             # dancing
    
            # tank
            # 18
            # 生蚝
    通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
     
  • 相关阅读:
    后缀树(suffix tree)
    哈希表(Hash Table)
    ansible报错Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this
    windows上python上传下载文件到linux服务器指定路径【转】
    MySQL参数最大连接数max_connections
    linux服务器last查看关机记录
    /etc/fstab文件详解【转】
    MySQL5.7更改用户名密码
    awk对列/行进行统计求和【转】
    passwd: Have exhausted maximum number of retries for service【转】
  • 原文地址:https://www.cnblogs.com/mofujin/p/11215642.html
Copyright © 2020-2023  润新知