昨日回顾
re
正则表达式
匹配字符串
场景 例如:爬虫,密码规则验证,邮箱地址验证,手机号码
学习re主要学习的就是 那一堆特殊符号
hashlib
hash是一种算法 lib表示库
该模块包含了一堆的hash算法
hash接受任意长度的输入,计算后,输出一段固定长度的字符串
根据算法的不同结果的长度也不同
在算法固定的情况下,输入的数据相同,输出的结果也必然相同
hash的两个作用:
1.加密 无法被反解
2.文件校验 比对两个文件是否完全相同
常用模块
1.logging *****
翻译为日志记录
该模块用于记录日志的
1.日志是什么?
日志其实就是日记,用于记录某个时间点发生了什么事
2.为什么要记录日志?
是为了日后来复查,提取有用的信息
3.如何来记录日志?
可以直接打开文件,往里写东西
直接写入文件的两个问题:
1.你写的数据格式,别人看不懂
2.解析数据麻烦 因此logging就诞生了 logging 专门用于记录日志 日志的级别 1.debug (最底层) 调试信息(用于记录程序在开发过程中的调试记录,例如,不清楚这个变量的值,所以打印一下) 2.info 记录普通信息(没特别的意义,就是简单的记录) 3.warning 警告信息(当某些操作可能发生错误,就记录为警告信息,涉及一些安全操作时,例如删库) 4,error 错误信息(当程序遇到错误时,列入要求用户输入一个整数,他偏要输入小数,导致数据类型转换失败) 5.critical 严重错误(当程序遇到问题,无法继续执行时,例如,需要一个核心组件,然而这个组件被用户删了) 为什么分级:随着时间的推移,你的日志会越来越多,成千上万条,这时候要提取有用的信息就很慢,所有使用logging,这样一来,在查看日志的时候,可以快速的定位到想要的日志 为什么要设置最低等级,因为一些级别的日志对我是无用的 如果我们需要更详细的去定制logging的各项功能,就需要我们系统的学习一下logging这个模块 四种核心角色 1.Logger 日志生成器:负责产生一条完整的日志 2.Filter 过滤器:负责对日志进行过滤 3.Handle 处理器:负责将日志输出到指定位置 4.Formater 格式化:负责处理日志显示的格式 一条日志的生命周期 1.由Logger产生日志 2.交给过滤器进行过滤 3.交给Hanlder按照Formater的格式进行输出 这三步都可以 对日志进行筛选,什么样的需要显示,什么样的不需要显示 使用方法 import logging
'[%(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_path = "dictconfig.log"
LOGGING_DIC = {
'version': 1,
# 是否禁用已存在的生成器 这个值保持为False 'disable_existing_loggers': False, # 四个key不能随便写 是固定 'formatters': { # standard 表示格式化处理器的名字 相当于变量名称 可以随便写 'standard': { # format是固定的不能随便写 'format': standard_format }, 'simple': { 'format': simple_format }, }, 'filters': {}, 'handlers': { #打印到终端的日志 #console是处理器的名称 可以随便写 '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', # 日志文件的编码 }, "ATM":{ 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 'formatter': 'standard', 'filename': "ATMlog.txt", # 日志文件 'maxBytes': 1024*1024*5, # 日志大小 5M 'backupCount': 5, #日志文件最大个数 'encoding': 'utf-8', # 日志文件的编码 } }, 'loggers': { #logging.getLogger(__name__)拿到的logger配置 #aa是生成器的名称 可以随便写 # 如果将key(生成器名称)设置为空 则意味着将它作为默认的是你生成器 '': { 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)传递 日志的继承 }, "atm":{ 'handlers': ['ATM'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)传递 日志的继承 } }, }``` # 了解知识点 # 自己来定义四种核心角色 import logging mylog = logging.getLogger("father") mylog.setLevel(10) handler = logging.FileHandler("father.log") mylog.addHandler(handler) handler.setLevel(10) fmter = logging.Formatter(fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s") handler.setFormatter(fmter) # 在获取一个生成器 同时指定该生成器的父生成器是father这个生成器 sonlog = logging.getLogger("father.son") # 需求:子生成器 的输出位置与父生成器不同 格式相同 sonhandler = logging.FileHandler("son.txt",encoding="utf8") sonlog.addHandler(sonhandler) sonfmt = logging.Formatter(fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s") sonhandler.setFormatter(sonfmt) # 继承后子生成器 可以直接使用父生成器的配置 # mylog.info("这是一条日志信息!") # sonlog.info("这是 son 输出的日志信息!") #子生成器 在生成一个日志时 会自动给父生成器也发一个 # 取消传递效果 sonlog.propagate = False sonlog.info("这是 son 输出的日志信息!") 学习logging模块,是为了更方便的记录日志,不用再自己解决日志记录的问题 #### 2.sys模块 *** 是system的缩写,表示系统,指的是python的解释器 import sys # 用于操作系统调用解释器时传入的参数 print(sys.argv) 当前文件路径,是解释器的第一个参数 给多个参数,用空格隔开 #当你要开发一款基于cmd的程序时,就需要使用这个属性了,因为一些操作系统没有界面,只能通过cmd来使用 #需求 开发一个基于cmd的复制文件的工具 第一个参数表示被执行的py文件,第二个作为源文件路径,第三个作为目标文件的路径 source_path = sys.argv[1] target_path = sys.argv[2] sys.exit(0) 表示正常退出 总结 sys]处理与python解释器相关的一些操作 添加环境变量 sys.path 获取调用解释器的参数 sys.argv #### 3.shevlem模块*** 用于序列化的模块:json,pickle import shelve shelve.open('test.she') s.['name'] = 'egon' s['dic'] = {'age':20} s = shelve.open('test.she') print(s['name']) #shelve 模块只有一个函数,就是open用于打开一个文件, 打开以后,操作方式与字典完全一致,你可以把它当成字典,并且是自带buff的字典,可以字典给完成序列化 同样支持 python所有的基础数据类型 该模块序列化得到的数据,只能被该模块使用,其他语言没有这个模块,所以无法使用,即无法跨平台,当你写的程序是一个单机程序时,可以考虑 后期,只要涉及到数据交换,就应该使用json