logging

日志:日常的流水 => 日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中

为什么要记录日志:优化程序,更好的服务

五个级别

logging.debug('调试 msg')
logging .info('消息 msg')
logging .warning('警告 msg')

logging.error('错误 msg')
logging.critical('严重 msg')

标准三流

import sys

# 标准输出流
sys.stdout.write('123\n')
sys.stdout.write('456\n')
print('值形成VB',end='')
print()

# 标准错误流
sys.stderr .write('11111')
sys.stderr .write('22222')
sys.stderr .write('444444444')

# 标准输入流

res=sys.stdin.readline()
print(res)

logging的基本配置

import logging

import sys

logging.basicConfig(
    stream=sys.stdout
)

可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler,日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到

sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。


format参数中可能用到的格式化串:
%(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:字符串形式的当前时间。默认格式是 “2019-05-09 16:49:45,896”。逗号后面的是毫秒

%(thread)d:线程ID。可能没有

%(threadName)s:线程名。可能没有

%(process)d:进程ID。可能没有

%(message)s:用户输出的消息

h1=logging.StreamHandler()
h2=logging.StreamHandler('d.loy')
logging.basicConfig(
    format='%(asctime)S [%(levelname)S]-%(name)S',
    datename='%Y-%m-%D %H:%M:%S',
    leval=logging.DEBUG,
    handlers=[h1,h2]
)

 

logging成员

import logging

logger:产生日志的对象

Filter:过滤日志的对象

Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式


1.新建打印者


logger=logging.getLogger('风月')
2.创建句柄,即输出的位置
stream_handler=logging.StreamHandler ()
a_file_handlear=logging.FileHandler('aa.log')
b_file_handlear=logging.FileHandler('bb.log')
3.打印者绑定句柄
logger.addHandler(stream_handler )
logger.addHandler(a_file_handlear)
logger.addHandler(b_file_handlear)


设置格式
Formatter1=logging.Formatter('%(asctime)s-%(msg)s')
Formatter2=logging.Formatter ('%(asctime)s [%(name)s]-%(msg)s')

5.为句柄绑定输出格式


stream_handler.setFormatter(Formatter1)
stream_handler.setFormatter(Formatter1)
stream_handler.setFormatter(Formatter2)

logger.critical('msg')

 

logger共存

 

import logging


1.新建打印者
logger=logging.getLogger('风月')
2.创建句柄,即输出的位置
stream_handler=logging.StreamHandler ()
a_file_handlear=logging.FileHandler('aa.log')
b_file_handlear=logging.FileHandler('bb.log')
3.打印者绑定句柄
logger.addHandler(stream_handler )
logger.addHandler(a_file_handlear)
logger.addHandler(b_file_handlear)

4.设置格式


Formatter1=logging.Formatter('%(asctime)s-%(msg)s')
Formatter2=logging.Formatter ('%(asctime)s [%(name)s]-%(msg)s')
5.为句柄绑定输出格式
stream_handler.setFormatter(Formatter1)
stream_handler.setFormatter(Formatter1)
stream_handler.setFormatter(Formatter2)

logger.critical('风月')

 

正则re

模块re

import re
# re就正则,是有语法的字符串,用来匹配目标字符串的

data = 'https://www.baidu.com'
# 需求:判断该数据是否是合法的url链接
# 合法的url应该满足:以 https:// | http:// 开头 且以 com | cn 结尾
# 字符串匹配,根据你的规定书写字符串与目标字符串进行配对,如果能配对成功,代表目标字符串满足需求
# 正则表达式:是一个可以同时制定多个规则的字符串


res = re.findall('https://www.baidu.com', data)
print(res)


# 将目标字符串中的所有数字找出
date='123qwe嗯嗯'
res=re.findall(r'\d',date)
print(res)

# 字母
res=re.findall('[a-z]',date)
print(res)

 

 

语法re

import re

# r 原义字符串

res='abc123嗯嗯abcABC'

# re.I不区分大小写的匹配
print(re.findall(r'a',res,flags=re.I) )
# a|b a或b单个字符
print(re.findall(r'a|b',res,flags=re.I) )
# [a,b] a或,或b单个字符
print(re.findall(r'[a,b]',res,flags=re.I) )
# [^ab]非a及非b的所有单个字符
print(re.findall(r'[^ab]',res,flags=re.I) )
# [a-z]所有单个小写字母
# A-Z]所有单个大写字母
# [0-9]所有单个数字
print(re.findall(r'[a-z]', res))
print(re.findall(r'[0-9]',res))
# 所有小写大写数字单个字符
print(re.findall(r'[0-9]|[a-z]|[A-Z]',res))
#   \d  单个数字 == [0-9]
print(re.findall(r'\d', res))
# \w == [A-Za-z0-9_]  将常见的汉字就理解为单个字母
print(re.findall(r'\w', 'abc,123嘿[_'))
# \s 单个空:空格、制表符、换页符等
print('\f\n\r\t\v')
print(re.findall(r'\s', '\f\n\r\t\v '))
# \D就是\d的对立面:非数字的所有单个字符
#  \W就是\w的对立面
#  \S就是\s的对立面
print(re.findall(r'\D', 'abc,123嘿[_'))
print(re.findall(r'\S', 'abc,123嘿[_'))
print(re.findall(r'\W', 'abc,123嘿[_'))

 

import re

# 匹配\这个字符
print(re.findall(r'\\', 'a\d\p\\'))
print(re.findall(r'\\', r'a\d\p\\'))

print(re.findall(r'\n', '\n'))
# 转换成匹配换行符的正则对象
print(re.findall(r'\d', '\d'))
print(re.findall(r'\\d', '\d'))

re_obj=re.compile(r'\\d')
# 转换成匹配 \d 的正则对象
res=re_obj.findall('\d')
print(res)

re_obj=re.compile(r'\d')
# 转换成匹配 数字 的正则对象
res=re_obj.findall('\d')
print(res)


re_obj = re.compile(r'\\n')
# 转换成匹配 \n 的正则对象
res = re_obj.findall('\n')
# 代表换行,不能被匹配
print(res)
res = re_obj.findall(r'\n')
# 就代表\n,能被匹配
print(res)

 

多个字符

import re

# .会匹配除\n以为的所有单个字符
print(re.findall(r'.','*\_+=\n \r\t') )
# re.S会让.能匹配所有单个字符
print(re.findall(r'.','*\_+=\n \r\t',re.S))

# 明确个数的重复
# {n}
print(re.findall(r'a', 'aaabbb'))
print(re.findall(r'a{2}', 'aaabbb'))
print(re.findall(r'b', 'aaabbb'))
print(re.findall(r'b{2}', 'aaabbb'))
print(re.findall(r'ab{2}', 'aaabbb'))

# {n,} 贪婪匹配
#  匹配n到无数个,
# 题中最少匹配abb,
# 贪婪匹配 abbb 能被匹配为 abb 和 abbb,
# 优先匹配多的

print(re.findall(r'ab{2,}', 'ababbabbbabbbb'))
# {,n}
# 匹配0到n个,
# ab{,2} 优先匹配abb,
# 没有ab也行,如果还没有a也可以
print(re.findall(r'ab{,2}', 'ababbabbbabbbb'))

# {n,m}
# 匹配n到m个,
# ab{1,3} 优先匹配
# abbb,再考虑abb, ab
print(re.findall(r'ab{1,3}', 'aababbabbbabbbb'))

# 特殊符号的重复
# *: 匹配0到无数个
print(re.findall(r'ab*', 'aababbabbbabbbb'))

# +: 匹配1到无数个
print(re.findall(r'ab+', 'aababbabbbabbbb'))

# ?: 匹配0到1个
print(re.findall(r'ab?', 'aababbabbbabbbb'))


# 需求:匹配所有单词
print(re.findall(r'[a-z]+', 'abc def hello print'))
print(re.findall(r'[a-z]+\b', 'abc def hello print'))


# \b代表单词边界,用空格(字符串的结尾也包括)作为匹配规则

print(re.findall(r'[a-z]*c', 'abc def hello print acb zc'))
print(re.findall(r'[a-z]*c\b', 'abc def hello print acb zc'))

分组匹配

import re

url = 'https://www.baidu.com, http://www.youku.com'
# 需求:拿到url的域名的  baidu , youku
print(re.findall(r'www.([a-z]+).com', url))

# ()代表分组
# findall匹配,如果匹配规则用有分组语法,只存放分组结果
print(re.findall(r'(www).([a-z]+).com', url))
# 分组的顺序编号按照左括号的前后顺序
print(re.findall(r'(((w)ww).([a-z]+).com)', url))

# findall是全文匹配,可以从任意位置开始,匹配多次
# match非全文匹配,必须从头开始匹配,只能匹配一次

# 专门处理分组的方法:分组,分组编号,有名分组,取消分组
# 取消分组: 必须写(),但是()为分组语法,我们只是想通过()将一些数据作为整体,所以()必须,再取消分组即可
# (?:) 取消分组只是作为整体   (?P<名字>) 有名分组
url = 'www.baidu.com,www.youku.com'
res = re.match(r'((?:www).(?P<name>[a-z]+).com)', url)
print(res)
print(res.group(1))
print(res.group(2))
print(res.group('name'))

正则方法

import re

s = 'a b ac def'
print(s.split(' '))

# 正则拆分
s = 'a b,ac@def'
print(re.split(r'[ ,@]', s))

# sub 替换
s = 'python abc python'
print(re.sub('python', 'Python', s))
print(re.sub('python', 'Python', s, count=1))


# 结合分组可以完成信息的重组与替换
s = 'day a good!!!'  # 'a good good day'
print(re.sub('(day) (a) (good)', r'today is \2 \3 \3 \1', s))

 

posted on 2019-05-09 23:52  我只想你  阅读(167)  评论(0编辑  收藏  举报