4.1python学习笔记

logging日志模块细节

	用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么 了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所以Python引入了 logging模块来记录我想要的信息。    print也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉 那些不需要的信息。 

日志级别

级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG  #日志级别(默认值为logging.WARNING),系统内置的级别有六种:DEBUG、INFO、WARNING、ERROR以及CRITICAL,系统会输出到控制台或者保存到日志文件的日志信息一定是等于或者高于当前等级的信息,例如 当level=logging.WARNING时,只会输出或者保存WARNING、ERROR和CRITICAL级别的信息,其他级别的 日志信息不会显示或保存,这也是level这个参数控制输出的意义所在。 

名词解释

Logging.Formatter:这个类配置了日志的格式,  在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。   Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:   1. 为程序提供记录日志的接口   2. 判断日志所处级别,并判断是否要过滤   3. 根据其日志级别将该条日志分发给不同handler   常用函数有:   Logger.setLevel() 设置日志级别   Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler   Logger.addFilter() 添加一个Filter,过滤作用   Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。   常用函数有:   setLevel() 设置级别   setFormatter() 设置Formatter 

基本使用

import logging # 1.logger对象:负责产生日志 logger = logging.getLogger('程序功能说明') # 2.filter对象:过滤日志(了解) # 3.handler对象:控制日志输出的位置(文件/终端) hd1 = logging.FileHandler('a.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', ) fm2 = logging.Formatter(         fmt='%(asctime)s - %(name)s:  %(message)s',         datefmt='%Y-%m-%d', )   # 5.给logger对象绑定handler对象。即给logger对象指定输出位置 logger.addHandler(hd1) logger.addHandler(hd2)   # 6.给handler绑定formmate对象。即给输出位置绑定输出内容的格式 hd1.setFormatter(fm1) hd2.setFormatter(fm2)   # 7.设置日志等级 logger.setLevel(10)   # 8.记录日志 logger.debug('运行开始') 

配置字典(必须的会修改配置,使用时可以复制)

'''     Python 3.2中引入的一种新的配置日志记录的方法--用字典来保存logging配置信息。这相对于上面所 讲的基于配置文件来保存logging配置信息的方式来说,功能更加强大,也更加灵活,因为我们可把很多的 数据转换成字典。     传递给dictConfig()函数的字典对象只能包含下面这些keys,其中version是必须指定的key,其它key 都是可选项: ''' 

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) #用os模块创建一个出来 # 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,#如果上面文件满了就直接新建一个5M的文件,最多存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')#必须注意该名字必须在上面的logger中定义,否则无内容记录。因此直接将上面的logger内不要定义名字,直接写空即可,程序会自动添加名字 logger1.debug('加油') 

这个就是模板,以后要去编写简单日志功能就可以去复制上述代码,封装成模块去调用就可以了

logging.config.dictConfig(LOGGING_DIC)  # (字典名)自动加载字典中的配置 #接下来生成一个对象 logger1 = logging.getLogger('fdsafsadfsa')#直接将上面的logger内不要定义名字,直接写空即可,程序会自动添加名字 logger1.debug('加油') 

第三方库或模块

通过Pycharm的设置安装第三方模块

File(文件)--> Settings(设置)--> Project:项目名字 --> Project Interpreter

在终端使用pip安装 pip3 install 模块名 '''该方式默认下载的是最新版本''' pip3 install 模块名==版本号 '''自定义下载版本号''' ps:pip工具默认是从国外的仓库下载模块 速度会比较慢 可以修改 pip3 install 模块名 -i 仓库地址 # 命令行临时修改地址  针对仓库地址 直接百度搜索pip源即可获得 (1)阿里云http://mirrors.aliyun.com/pypi/simple/ (2)豆瓣http://pypi.douban.com/simple/ (3)清华大学https://pypi.tuna.tsinghua.edu.cn/simple/ (4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/ (5)华中科技大学http://pypi.hustunique.com/  

openpyxl模块

'''写模块:Workbook()''' from openpyxl import Workbook wb = Workbook()  #先生成一个工作簿 wb.save('test.xlsx')# 保存新建的excel文件 '''创建新的表单页.create_sheet()''' wb1 = wb.create_sheet('index',0) '''修改表单页名称:.title''' wb1.title = 'login' '''为表单赋值''' wb1['A3'] = 123 wb1['A4'] = 456 '''指定具体某行某列的数据''' wb1.cell(row=6,column=3,value=88888888) '''wb1['A5'] = '=sum(A3:A4)'''' #按照一行一行的顺序传值 wb1.append(['username','age','hobby']) wb1.append(['张三',20,'学习']) wb1.append(['李四',18,'吃饭']) wb1.append(['王二',23,'睡觉']) wb1.append(['麻子',25,'跑步']) # 保存新建的excel文件 # wb.save('test.xlsx')