常见内置模块以及方法
一:logging模块#
(1)日志模块
(1)debug:调试信息
(2)info: 程序运行输出的信息
(3)warning:程序告警信息
(4)error:程序错误信息
(5)critical:严重错误
(2)日志等级:
(1)debug:level = 10
(2)info: level = 20
(3)warni:level = 30
(4)error:level = 40
(5)critical:level = 50
(3)打印方式:
(1)默认为打印到终端:默认打印到终端
(2)打印实例

logging.debug('打印debug') logging.info('打印info') logging.warning('打印warning') logging.error('打印报错') logging.critical('打印严重错误') ''' WARNING:root:打印warning ERROR:root:打印报错 CRITICAL:root:打印严重错误 '''
PS:输出信息只能输出等级比自己大的 例如warning默认为30 其只能打印(30-50)
(4)logging模块的常规参数:

可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有 filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 #格式 %(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:用户输出的消息
配置实例:

logging.basicConfig(filename='access.log', # 设置接收文件 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # 文件格式 datefmt='%Y-%m-%d %H:%M:%S %p', # 文件时间 %p 显示上下午 level=10) # 日志等级 logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.error('错误error') logging.critical('严重critical')
PS:不能同时在终端 以及文件中接收日志 且在文件中日志会乱码 因为pycharm默认使用utf-8编码 而保存到文件夹中以自己系统为编码格式
例如:

logging.basicConfig(filename='access.log', # 设置接收文件 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # 文件格式 datefmt='%Y-%m-%d %H:%M:%S %p', # 文件时间 %p 显示上下午 level=10, # 日志等级 stream = sys.stdout) # 输出到终端 # ValueError: 'stream' and 'filename' should not be specified together logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.error('错误error') logging.critical('严重critical') ''' 2019-07-19 20:01:40 PM - root - DEBUG -day17: ����debug 2019-07-19 20:01:40 PM - root - INFO -day17: ��Ϣinfo 2019-07-19 20:01:40 PM - root - WARNING -day17: ����warn 2019-07-19 20:01:40 PM - root - ERROR -day17: ����error 2019-07-19 20:01:40 PM - root - CRITICAL -day17: ����critical '''
(5)logging的四种对象
(1)logger:产生日志的对象
(2)Filter:过滤日志
(3)handler:处理日志输出(终端/文件输出)
(4)Formatter:定制日志的格式
图解:
例如:

# 产生日志 logger1 = logging.getLogger('产生日志名称') # 处理日志 fh1 = logging.FileHandler( filename = 'a1.log',encoding='utf-8') # 打印到文件 fh2 = logging.StreamHandler() # 打印到终端 # 日志格式 for1 = logging.Formatter( fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p' ) for2 = logging.Formatter( fmt='%(asctime)s ', datefmt='%Y-%m-%d %H:%M:%S %p' ) # 建立日志对文件的处理方式 logger1.addHandler(fh1) # 对文件打印 logger1.addHandler(fh2) # 对终端打印 # 建立格式与文件的处理关系 fh1.setFormatter(for1) fh2.setFormatter(for2) # 设置等级 logger1.setLevel(10) logger1.debug('调试信息')
(6)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' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志输出格式 结束 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录 logfile_name = 'all2.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)传递 }, }, } def load_my_logging_cfg(): logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 logger = logging.getLogger(__name__) # 生成一个log实例 logger.info('It works!') # 记录该文件的运行状态 if __name__ == '__main__': load_my_logging_cfg() logging配置文件
二:hashlib模块#
摘要算法:MD5 sha
特点:
(1)不定长输入 定长输出
(2)不能通过散列值 反向逆推原文件
(3)文件只要稍微被修改一点 散列值会发生巨大变化
PS:
(1)MD5 128bit
(2)sha1 160bit
作用:
(1)数据进行加密
(2)检验文件是否被篡改
使用方式:
import hashlib md = hashlib.md5() md.update('hello') # 必须是二进制 Unicode-objects must be encoded before hashing print(md.hexdigest()) md_5 = hashlib.md5() md_5.update(b'hello') print(md_5.hexdigest()) # 5d41402abc4b2a76b9719d911017c592
小特点:
(1)传入数据可以分多次传入 只要传入内容相同 散列值不变
md5 = hashlib.md5() md5.update(b'how to use md5 in python hashlib?') print(md5.hexdigest()) # d26a53750bc40b38b65a520292f69306 md5 = hashlib.md5() md5.update(b'how to use md5 in ') md5.update(b'python hashlib?') print(md5.hexdigest()) # d26a53750bc40b38b65a520292f69306
加盐:
作用:在真正数据之前在封装一层md5算法值 防止被状况
例如:
md5 = hashlib.md5() md5.update(b'SR') # 加盐 md5.update(b'how to use md5 in python hashlib?') # d26a53750bc40b38b65a520292f69306 真实的散列值 print(md5.hexdigest()) # 362f3a336c2d7cb652e83e6289a73eda 伪装之后的散列值
总结:
(1)算法长度越长 散列值越南被破解
(2)加密速度相对较慢 占用内存资源比较多
三:openpyxl#
作用:操作excel表格
操作方式一
写表格(xlwd):
例如:
from openpyxl import Workbook wb = Workbook() # 先生成一个工作簿 wb1 = wb.create_sheet('index',0) # 创建一个表单页 后面可以通过数字控制位置 wb2 = wb.create_sheet('index1') wb1.title = 'login' # 后期可以通过表单页对象点title修改表单页名称 wb1['A3'] = 666 wb1['A4'] = 444 wb1.cell(row=6,column=3,value=88888888) # 6行3列 值 wb1['A5'] = '=sum(A3:A4)' # 求和 wb.save('test.xlsx') # 报错
wb1.append(['username','age','hobby']) # 添加表格名称
操作方式二:
读表格(xlrt)
例如:
wb = load_workbook('test.xlsx',read_only=True,data_only=True) print(wb) print(wb.sheetnames) # ['login', 'Sheet', 'index1'] 查看表单的名字 print(wb['login']['A3'].value) # 取值
四:深浅拷贝
(1)作用:复制
例如:
l = [1,2,[1,2]] l1 = 1 print(id(l),id(l1)) # 44778696 500657632
图解:
(2)分类:
(1)浅拷贝
例如:
import copy l = [1,2,[1,2]] l1 = copy.copy(l) l[2].append(666) print(l) # [1, 2, [1, 2, 666]] print(l1) # [1, 2, [1, 2, 666]]
图解:
PS:
(1)其指向容器类型的外层,即都是共用一个容器
(2)如果内部含有可变类型,因为都是共用一个容器 其不会改变
(3)如果为不可变类型 如果原值改变 不会影响复制之后的 原值改变相当于将线断开 指向别的
(2)深拷贝
import copy l = [1,2,[1,2]] l1 = copy.deepcopy(l) l[2].append(666) print(l) # [1, 2, [1, 2, 666]] print(l1) # [1, 2, [1, 2, ]]
图解:
PS:
(1)深拷贝如果针对不可变类型 其会指向原有数据
(2)针对可变类型其会开辟一个新的容器类型
(3)因为自己新建一个 原有改变不影响
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!