常用内置模块和第三方模块
常用内置模块和第三方模块
日志模块的主要组成部分
import logging
# 1. 产生日志对象
logger = logging.getLogger('日志')
# 2.filter对象:过滤日志 (剔除不良品)
# 针对过滤功能完全可以不看 因为handler自带了基本的过滤操作
# 3.handler对象:控制日志输出位置(文件、终端...)
hd1 = logging.FileHandler('a.log',encoding='utf8') # 输出日志到文件中去
hd2 = logging.StreamHandler() # 输出到终端
# 4.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',
)
# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
# 7.设置日志等级
logger.setLevel(40) # error
# 8.记录日志
logger.error('日志来了')
日志格式化输出
import logging.config
# 定义日志输出格式
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 = 'a.log'
# 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)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
# '注册记录': {
# 'handlers': ['console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
# 'level': 'WARNING',
# 'propagate': True, # 向上(更高level的logger)传递
# }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
# 使用日志字典配置
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
logger = logging.getLogger('日志')
logger.debug('出错了')
日志参数
字符参数 | 效果 |
---|---|
%(name)s | Logger的名字 |
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出函数的模块的完整路径名,可能没有 |
%(filename)s | 调用日志输出函数的模块的文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(funcName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数的语句所在的代码行 |
%(created)f | 当前时间,用UNIX标准的表示时间的浮 点数表示 |
%(relativeCreated)d | 输出日志信息时的,自Logger创建以 来的毫秒数 |
%(asctime)s | 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(thread)d | 线程ID。可能没有 |
%(threadName)s | 线程名。可能没有 |
%(process)d | 进程ID。可能没有 |
%(message)s | 用户输出的消息 |
配置字典如何在项目中使用
# 按照软件开发目录规范编写使用
日志字典数据应该放在哪个py文件内
字典数据是日志模块固定的配置 写完一次之后几乎都不需要动
它属于配置文件
import logging
from conf import settings
def get_logger(msg):
# 记录日志
logging.config.dictConfig(settings.LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger(msg)
return logger1
logger = get_logger('日志')
logger.debug('出错了')
第三方模块
# pip工具
帮助我们使用第三方模块的工具
# 下载第三方模块
方式一:命令行操作
cmd中敲命令pip3 install 模块名(默认下载最新版本)
pip3 install 模块名==版本号 '''自定义下载版本号'''
ps:pip工具默认是从国外的仓库下载模块 速度会比较慢 可以修改
pip3 install 模块名 -i 仓库地址 # 命令行临时修改地址
方式二:利用编程工具下载
settings>project>python interprter>点击加号搜索即可
更换下载源:manage repositoires
openpyxl模块
"""以后我们会接触到很多第三方模块 那么统一的学习策略其实就是看文档"""
'''openpyxl模块就是操作Excel的'''
# 创建excel文件
wb = Workbook()
wb1 = wb.create_sheet('工作簿1',0) # 创建工作簿,第二个参数指定工作簿位置
wb2 = wb.create_sheet('工作簿2',1)
wb1.title = '工资表' # 指定工作簿名称
wb.save('1.xlsx') # 创建Excel文件
# 写文件
# 1.指定位置写入A列3行
wb1['A3'] = 'oscar' # 工作簿A3格添加内容oscar
wb.save('1.xlsx') # 每一次添加完内容都要保存
# 2.指定位置写入(传参型)1(A)列4行
wb1.cell(4,1,'petter')
wb.save('1.xlsx')
# 3.批量写入(接着最后一行写)
wb1.append(['lili',18])
wb.save('1.xlsx')
# 4.公式(也可以在python代码中处理完毕以普通数据写入)
wb1['A6'] = '=sum(A3:B5)'
wb.save('1.xlsx')
# 读文件
# 读文件
from openpyxl import load_workbook
wb = load_workbook('1.xlsx',data_only=True)
print(wb.sheetnames) # 获取1.xlsx文件的所有工作簿名称
wb1 = wb['工资表'] # 拿到工资表工作簿
# 指定位置取值
print(wb1['A3'].value) # 取出A3格的值oscar
print(wb1.cell(3,1).value) # 取出A3格的值oscar
# 一行行取值
for i in wb1.rows: # 获取每一行的值
for data in i: # 遍历每一行的每个值
print(data.value)
# 获取一列列的数据(如果想获取 必须把readonly去掉)
for column in wb1.columns: # 拿到每一列的数据
for r in column: # 遍历每一个单元格数据
print(r.value)
# 获取最大的行数和列数
print(wb1.max_row)
print(wb1.max_column)