zoukankan      html  css  js  c++  java
  • logging,numpy,pandas,matplotlib模块

    logging模块

    日志总共分为以下五个级别,这五个级别自下而上进行匹配debug->info->warning->error->critical,默认的最低级别warning级别

    logging模块包含四种角色:logger,Filter,formatter,Handler

    1. logger:产生日志对象

    2. Filter:过滤日志的对象

    3. Formatter:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

    4. Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

    低配logging

    '''
    critical=50
    error =40
    warning =30
    info = 20
    debug =10
    '''
    
    
    import logging
    
    # 1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
    logger = logging.getLogger(__file__)
    
    # 2、Filter对象:不常用,略
    
    # 3、Handler对象:接收logger传来的日志,然后控制输出
    h1 = logging.FileHandler('t1.log')  # 打印到文件
    h2 = logging.FileHandler('t2.log')  # 打印到文件
    sm = logging.StreamHandler()  # 打印到终端
    
    # 4、Formatter对象:日志格式
    formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                                   datefmt='%Y-%m-%d %H:%M:%S %p',)
    
    formmater2 = logging.Formatter('%(asctime)s :  %(message)s',
                                   datefmt='%Y-%m-%d %H:%M:%S %p',)
    
    formmater3 = logging.Formatter('%(name)s %(message)s',)
    
    
    # 5、为Handler对象绑定格式
    h1.setFormatter(formmater1)
    h2.setFormatter(formmater2)
    sm.setFormatter(formmater3)
    
    # 6、将Handler添加给logger并设置日志级别
    logger.addHandler(h1)
    logger.addHandler(h2)
    logger.addHandler(sm)
    
    # 设置日志级别,可以在两个关卡进行设置logger与handler
    # logger是第一级过滤,然后才能到handler
    logger.setLevel(30)
    h1.setLevel(10)
    h2.setLevel(10)
    sm.setLevel(10)
    
    # 7、测试
    logger.debug('debug')
    logger.info('info')
    logger.warning('warning')
    logger.error('error')
    logger.critical('critical')
    

    高配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()指定的名字;lineno为调用日志输出函数的语句所在的代码行
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    # 定义日志输出格式 结束
    
    logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # log文件的目录,需要自定义文件路径 # atm
    logfile_dir = os.path.join(logfile_dir, 'log')  # C:UsersoldboyDesktopatmlog
    
    logfile_name = 'log.log'  # log文件名,需要自定义路径名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):  # C:UsersoldboyDesktopatmlog
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)  # C:UsersoldboyDesktopatmloglog.log
    # 定义日志路径 结束
    
    # log配置字典
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},  # filter可以不定义
        'handlers': {
            # 打印到终端的日志
            'console': {
                'level': 'DEBUG',		#设置级别
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
            # 打印到文件的日志,收集info及以上的日志
            'default': {
                'level': 'INFO',
                '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配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
            '': {
                # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'handlers': ['default', 'console'],
                'level': 'DEBUG',
                'propagate': False,  # 向上(更高level的logger)传递
            },
        },
    }
    
    
    
    def load_my_logging_cfg(name):
        logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
        logger = logging.getLogger(name)  # 生成一个log实例
        logger.info('赵嘉豪成功了')  # 记录该文件的运行状态
        
        return logger
    
    
    if __name__ == '__main__':
        load_my_logging_cfg()
        logger=load_my_logging_cfg(zhao)
        logger.warning('我传进了一个警告')
    

    numpy

    numpy是Python的一种开源的数值计算扩展库。这种库可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示矩阵)。

    numpy库有两个作用:

    1. 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
    2. 计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。
    import numpy as np
    # 创建一维的ndarray对象
    arr = np.array([1, 2, 3])
    print(arr, type(arr))
    # 创建二维的ndarray对象
    print(np.array([[1, 2, 3], [4, 5, 6]]))
    
    [[1 2 3]
     [4 5 6]]
    

    获取矩阵的行列数

    #获取矩阵的行和列构成的数组
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr.shape)  #(2,3)
    
    #获取矩阵的行
    print(arr.shape[0])
    
    #获取矩阵的列
    print(arr.shape[1])
    

    切割矩阵

    切分矩阵类似于列表的切割,但是与列表的切割不同的是,矩阵的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。

    #取得所有元素
    print(arr[:,:])
    
    #取第一行的所有元素
    print(arr[0,:])
    
    #取第一列所有元素
    print(arr[:,0])
    
    #取大于5的元素,返回一个数组
    print(arr[arr>5])
    
    #矩阵按运算符获取元素的原理,即通过arr>5生成一个布尔矩阵
    print(arr>5)
    #[[False False False False]
    #[False  True  True  True]
    #[ True  True  True  True]]
    

    矩阵元素的替换

    矩阵元素的替换,类似于列表元素的替换,并且矩阵也是一个可变类型的数据,即如果对矩阵进行替换操作,会修改原矩阵的元素,所以下面我们用.copy()方法举例矩阵元素的替换

    # 取第一行的所有元素,并且让第一行的元素都为0
    arr1 = arr.copy()
    arr1[:1, :] = 0
    print(arr1)
    
    
    # 取所有大于5的元素,并且让大于5的元素为0
    arr2 = arr.copy()
    arr2[arr > 5] = 0
    print(arr2)
    
    
    # 对矩阵清零
    arr3 = arr.copy()
    arr3[:, :] = 0
    print(arr3)
    

    通过函数创建矩阵

    # 构造0-9的ndarray数组
    print(np.arange(10))
    

    [0 1 2 3 4 5 6 7 8 9]

    # 构造1-19且步长为2的ndarray数组
    print(np.arange(1, 20, 2))
    

    矩阵的运算

    两个矩阵的对位元素进行+ - * / % **的操作

    pandas模块

    pandas基于Numpy,可以看成是处理文本或者表格数据。pandas中有两个主要的数据结构,其中Series数据结构类似于Numpy中的一维数组,DataFrame类似于多维表格数据结构。

    pandas是python数据分析的核心模块。它主要提供了五大功能:

    1. 支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
    2. 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
    3. 支持多表拼接合并操作。
    4. 支持简单的绘图操作。
    5. 支持简单的统计分析操作。

    matplotlib模块

    matplotlib是一个绘图库,它可以创建常用的统计图,包括条形图,箱型图,折线图,散点图和直方图

  • 相关阅读:
    python之模块与包
    python之异常处理
    python之os与json&pickle模块
    python之random、time与sys模块
    python之re模块
    python之匿名函数、递归与二分法
    python之内置函数
    python之迭代器、生成器及列表推导式
    python之第一对象,函数名的应用,闭包
    python之命名空间与作用域
  • 原文地址:https://www.cnblogs.com/zhoajiahao/p/11019625.html
Copyright © 2011-2022 走看看