logging模块
#日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中
#1、logging模块一共分为五个打印级别 debug、info、warning、error、critical
#2、级别本身没有代表信息重要性的区别,只是包含级别信息,可以约定日志的重要性
标准的三流
import sys # 标准的三流 stdout | stdin | stderr # stdout和stderr两个是抢cpu工作,没有规定的前后 sys.stdout.write('aaa') # aaa 正常信息的输出,白字输出 sys.stderr.write('aaa') # aaa 异常信息的输出,红字输出 res = sys.stdin.read(2) # 信息的输入,括号里表示打印几个字符 res = sys.stdin.readline() # 信息的输入,readline表示一次打印一行 print(res)
logging的基本配置
import logging import sys h1 = logging.FileHandler('a.txt',encoding='utf-8') # 可以往文件里写日志 h2 = logging.StreamHandler() # 可以往控制台打印日志 logging.basicConfig( # filename='a.txt', # 打印到文件中 # stream=sys.stderr, #打印到控制台 format='%(asctime)s %(name)s %(message)s', # 打印格式 level=logging.ERROR, #或者用数字40表示 日志等级 datefmt='%Y-%m-%d %H:%M:%S', # 时间格式 handlers=[h1,h2] # 可以同时控制打印到文件和控制台上 ) res = logging.getLogger('owen') res.critical('error')
logging四大成员
import logging # 四大成员 logger(打印者)、filter(过滤)、handler(句柄)、formatter(格式) # 1、新建打印者 --生产日志信息 logger = logging.getLogger('owen') # 2、创建句柄 --控制信息打印位置 stream_handler = logging.StreamHandler() # 打印到控制台 file_handler = logging.FileHandler('文件绝对路径') # 打印到文件 # 3、打印者绑定到句柄 logger.addHandler(file_handler) # 确定生产完路径的输出位置 # 4、设置格式 fmt = logging.Formatter('%(asctime)s %(name)s %(message)s') # 5、为句柄绑定输出格式 stream_handler.setFormatter(fmt)
多logger共存
import logging # 1、创建多logger log1 = logging.getLogger('owen') log2 = logging.getLogger('zero') # 2、logger设置级别 log1.setLevel(logging.INFO) # 默认是warning # 3、设置句柄 h1 = logging.StreamHandler() # 4、设置句柄级别 # 1)系统句柄默认级别是warning # 2)自定义的句柄级别默认同logger(不写就和logger级别一样),也可以在logger基础上追加限制 # h1.setLevel(logging.ERROR) # 5、logger绑定句柄 log1.addHandler(h1) log1.info('aaa')
logging配置基本样貌
LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'o_fmt1': { 'format': '%(name)s:%(asctime)s - %(message)s' }, 'o_fmt2': { 'format': '%(name)s:%(asctime)s [%(levelname)s] - %(message)s' } }, 'filters': {}, 'handlers': { 'o_cmd': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'o_fmt1' }, 'o_file': { 'level': 'WARNING', 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'o_fmt2', 'filename': r'F:\python8期\课堂内容\day20\代码\part4\logging.log', # 日志文件 'maxBytes': 1024*1024*5, # 日志大小 5M 'backupCount': 5, #日志文件最大个数 'encoding': 'utf-8', # 日志文件的编码 } }, 'loggers': { 'o_owen': { 'level': 'DEBUG', 'handlers': ['o_cmd', 'o_file'] }, 'o_zero': { 'level': 'DEBUG', 'handlers': ['o_cmd', 'o_file'] } } }
正则re模块
----正则:是有语法的字符串 ,用来匹配目标的字符串
单个字符
import re # 单个字符 print(re.findall(r'b','sdsbafr')) # 把单个b打印出来['b'] # re.I 不区分大小写的匹配 print(re.findall(r'b','ssdbfBDF',flags=re.I)) # ['b', 'B'] # a|b a或b单个字符 print(re.findall(r'a|b','abc123嘿嘿')) # ['a', 'b'] # [a,b] a或,或b单个字符 print(re.findall(r'[a,b]','abc,123,嘿嘿')) # ['a', 'b', ',', ','] # [^ab] 非a及非b以外所有单字符 print(re.findall(r'[^ab]','abc123黑')) # ['c', '1', '2', '3', '黑'] # [a-z]所有单个小写字母 [A-Z]所有单个大写字母 [0-9] 所有单个数字 print(re.findall(r'[a-z]','abc123嘿嘿')) # ['a', 'b', 'c'] print(re.findall(r'[A-Z]','ab12嘿AB')) # ['A', 'B'] print(re.findall(r'[0-9]','abc123嘿嘿')) # ['1', '2', '3'] # [a-zA-Z0-9]所有小写大小数字的单个字符 print(re.findall(r'[a-zA-Z0-9]','*SDa2.')) # ['S', 'D', 'a', '2'] # .会匹配除\n以外的所有单个字符 print(re.findall(r'.','%sr\n2\t')) # ['%', 's', 'r', '2', '\t'] # re.S能让.匹配所有单个字符 print(re.findall(r'.','%sd\n2\t',flags=re.S)) # ['%', 's', 'd', '\n', '2', '\t'] # \d匹配单个数字 == [0,9] print(re.findall(r'\d','abc123嘿嘿')) # ['1', '2', '3'] # \w == [a-zA-Z0-9_] 匹配所有单个数字字母下划线 ,汉字理解为字母 print(re.findall(r'\w','ab12呵_呵')) # ['a', 'b', '1', '2', '呵', '_', '呵'] # \s == [\f\n\t\v] 单个空:空格、制表符、换页符 print(re.findall(r'\s','\f\n \t\v')) # ['\x0c', '\n', ' ', '\t', '\x0b'] # \D就是\d的对立面,非数字的所有单个字符,\W就是\w的对立面,\S就是\s对立面 # 建议使用 [0,9] [a-zA-Z0-9_] [\f\n\t\v] [^0-9] # 不建议使用 \d \w \s \D
正则匹配步骤
1、将r'\\'的正则语法的字符串转换成正则对象'\' , 用来匹配'\'字符的
2、拿着转换后的正则对象去匹配目标字符串
3、将匹配成功的对象打印出来
--re.findall()走的底层在下面,了解即可
re_obj = re.compile(r'\n')
res = reobj.findall('\n')
print(res) ['\n']