python之loggin模块与第三方模块


目录
  • logging模块详解
  • 第三方模块
  • openpyxl模块

logging模块详解

主要组成部分

  1. logger对象,用于产生日志
# 第一步,创建logger对象
logger = logging.getLogger()
  1. filter对象,用于过滤日志,可以不用管,handler对象自带了基本的过滤操作。

  2. handler对象,用于控制日志的输出位置(文件、终端等)

# 第二步,控制输出的位置

# 输出到文件中,可以自定义路径
hd1 = logging.FileHandler('a1.log', encoding='utf-8') 
# 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8')
# 输出到终端
hd3 = logging.StreamHandler()  
  1. format对象,控制日志的输出格式
# 第三步,编辑日志的输出格式

# 格式一:
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',
)
  1. 给logger对象绑定handler对象
# 第四步,绑定handler对象

# 绑定hd1
logger.addHandler(hd1)
# 绑定hd2
logger.addHandler(hd2)
# 绑定hd3
logger.addHandler(hd3)
  1. 给handler绑定format对象
# 第五步,绑定format对象

# 让hd1输出fm1的格式
hd1.setFormatter(fm1)
# 让hd2输出fm2的格式
hd2.setFormatter(fm2)
# 让hd3输出fm1的格式
hd3.setFormatter(fm1)
  1. 设置日志等级
# 第六步,设置日志等级
logger.setLevel(10)  # 输出debug及以上的等级的日志
"""
等级:
debug  10
info  20
warning  30
error  40
critical  50
"""
  1. 输出内容到日志
# 第七步,自定义输出内容
logger.debug('这是一段debug日志内容!!')
logger.info('这是一段info日志内容!!')

配置日志字典

想要输出日志还有一个更加好用的方法,我们可以先配置一个日志字典,定义好参数后,只需要用三行代码就可以把日志输出了。

导入模块和配置输出路径和输出格式

import logging
import logging.config

# 定义复杂的日志输出格式, 其中name为getlogger指定的名字
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'

# 定义一个简单版的输出格式
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

# 自定义文件路径
logfile_path = 'a3.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'  # 绑定的输出格式
        },
        'default': {  # 打印到文件的日志
            'level': 'DEBUG',  # 定义日志可以输出的等级
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',  # 绑定的输出格式
            'filename': logfile_path,  # 输出的路径
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,  # 日志个数,5个
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置
        # 当键不存在的情况下(也就是key设为空字符串),默认都会使用该k:v配置
        # loggers配置中使用空字符串作为字典的键,兼容性最好
        '': {  # 可以当作是日志输出的分类信息
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',  # 定义日志可以输出的等级
            'propagate': True,  # 向上(更高level的logger)传递
        },
    },
}

输出日志

logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
# 自定义分类信息会传给日志字典中'logger'中的空字符串
logger1 = logging.getLogger('自定义分类信息')
# 输出到日志的信息
logger1.debug('这是一段debug日志')

第三方模块

在python中如果想要使用第三方模块,就需要使用python解释器提供的pip工具。

在使用pip功能的时候需要先将你的python解释器安装目录下的scripts文件夹添加到环境变量中。

安装第三方模块:

方法一:在cmd窗口使用pip命令安装

pip install 模块名

如果想要下载指定版本

pip install 模块名==版本号

如果觉得下载慢,可以添加仓库地址

pip install 模块名 -i 仓库地址

"""
如:
(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/
"""

方法二:使用pycharm中安装

  1. 打开pycharm,选择左上角file-->setting
  2. project-->python Interpreter, 点击+号
  3. 搜索需要的模块并安装

openpyxl模块

openpyxl模块主要是与excel交互的作用,使用前需要下载模块。

打开cmd窗口

pip3 install openpyxl

创建excel文件操作

# 导入模块
from openpyxl import Workbook

# 创建excel文件
wb = Workbook()  

# 按顺序创建工作簿
wb1 = wb.create_sheet('高一(0)班')
wb2 = wb.create_sheet('高一(2)班')
wb3 = wb.create_sheet('高一(3)班')
# 指定位置创建工作簿
wb4 = wb.create_sheet('高一(4)', 2)  # 2代表第二个

# 改变工作簿名称
wb1.title = '高一(1)班'

# 写入数据
# 往高一(1)班表中的A3位置写入值
wb1['A3'] = '好厉害'
# 往高一(1)班表中第三行第四列的位置写入值
wb1.cell(row=3, column=4, value='我饿了')
# 批量写普通数据
wb1.append(['id','username','password'])

# 保存excel文件
wb.save('wb.xlsx')

运行结果:

读取excel文件操作

"""读取刚刚创建的wb.excel文件"""
# 导入模块
from openpyxl import load_workbook

# 实例化
wb = load_workbook('wb.xlsx',read_only=True,data_only=True)
# 获取wb.xlsx中所有的工作薄名称, 结果是列表数据类型
print(wb.sheetnames)  

"""
对于load_workbook()
第一需要加一个参数
第二需要人为的先去修改一下用程序产生的excel表格(不可能用程序产生excel文件之后又直接再用程序去读入,这样没有任何实际意义 通常用程序创建好表格后给人看,人自己修改的表格再交由程序处理)
"""

wb1 = wb['高一(1)班']  # 拿到工作薄高一(1)班对象

# 第一种取值方式
print(wb1['A3'].value)  # wb1['A3']不是结果,需要再调用value

# 第二种取值方式
print(wb1.cell(row=3,column=4).value)  

运行结果:

['Sheet', '高一(1)班', '高一(4)', '高一(2)班', '高一(3)班']
好厉害
我饿了

获取数据也可以使用for循环

# 获取一行行的数据
for row in wb1.rows:  # 拿到每一行的数据
    for data in row:  # 拿到一行行数据里面每一个单元格的数据
        print(data.value)

# 获取一列列的数据(如果想获取 必须把readonly去掉)
for column in wb1.columns:  # 拿到每一列的数据
    for r in column:  # 拿到一列列数据里面每一个单元格的数据
print(r.value)

# 获取最大的行数和列数
print(wb1.max_row)
print(wb1.max_column)