Python学习第二阶段Day2,模块subprocess、 logging、re
1、logging
日志开关,设置全局只打印什么级别的日子,默认是warning以下的都不打印
改默认级别:依次升高
logging.debug("")
logging.info("")
logging.warning("")
logging.error("")
logging.critical("")
看当前日志级别
输出到文件里:
logging.basicConfig(filename="app.log", level=logging.DEBUG)
#DEBUG以上的都输出了,再执行就往后追加,改成warning后,包含warning和以上级别的输出
缺少时间啊,下面加上时间
logging.basicConfig(filename="app.log", level=logging.DEBUG,format='%(asctime)s-%(message)s',datefmt='%Y-%m-%d %H:%M:%S')
输出:
2017-07-28 22:40:37-内容
时间至少一个套路,还有很多套路:见套路表 :
日志格式
|
%(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 |
用户输出的消息 |
可以打印时间,am pm模块名,行号,函数名,错误级别,进程号,线程号等
-------------------------------需求来了-------想要日志即在屏幕上又在文件里同时输出怎么办——?
Python提供四个类关于日志的
logger类,提供应用程序可以直接使用的接口,用户直接调用这个接口
handler类:将logger创建的日志输出到哪里?将logger创建的日志发屏幕,或者记录,或者远程机器或者邮件
filter类:过滤包含什么字段怎么发,复杂用的比较少
formatter:决定日志记录的最终输出格式
会用到三个类
输出信息前获得一个logger,通常一个模块对应一个logger
LOG = logging.getLogger("chat.gui") 例如chat.gui为名字
自己起个名字,MySQL或者ngix 都有两个日志,分别由两个logger输出。分门别类的输出文件
Logger.setLevel()设置级别,最低级别,低于该级别被忽略
addfilter()不说了
addhandler() 通过logger记录一条日志,添加handler到logger通过几个handler,就同时发到几个地方
几个handler:-------》
1.StreamHandler 屏幕.使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:StreamHandler([strm])其中strm参数是一个文件对象。默认是sys.stderr
2.FileHandler 文件
每个handler可以分别设置级别
Handler.setLevel() Handler.setFormatter() Handler.addFilter() Handler.remove...
定义日志格式Format
可以定义不同的文件格式,文件可以和屏幕不一样
ch = logging.formatter("asdfasdfasdf")
formater 跟handler关联
hdler.setFormatter(ch)
吧handler告诉logging
logger.addHandler(hdler)
这样子,就实现了日志记录目的地的多样性,和输出格式的多样性
先getlogger,屏幕,文件handler,再定义两种格式,格式跟handler绑定,再把handler跟logger绑定。
import logging # logging.basicConfig(filename="aaaaa.log",
# level=logging.CRITICAL,
# format='%(asctime)s-%(levelname)s : %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S')
# # level low to top
# logging.debug("!!!!!debug")
# logging.info("!!!!info")
# logging.warning("!!!!warning")
# logging.error("!!!!error")
# logging.critical("!!!!!!") # ---- 在屏幕和文件中输出------------------
log1 = logging.getLogger("logger1") # 名为logger1的log1对象
log1.setLevel(logging.DEBUG) had1 = logging.StreamHandler() # 屏幕和级别
had1.setLevel(logging.INFO) had2 = logging.FileHandler("had2.log", encoding="utf-8") # 文件和级别
had2.setLevel(logging.WARN) fm1 = logging.Formatter('%(asctime)s-%(levelname)s : %(message)s') #格式1
fm2 = logging.Formatter('%(levelname)s : %(message)s') # 格式2 had1.setFormatter(fm1) #绑定formatter
had2.setFormatter(fm2) log1.addHandler(had1) #添加handler
log1.addHandler(had2) log1.info("aaaa")
log1.warning("哈哈哈") # 屏幕:
# 2017-07-28 23:11:02,946-INFO : aaaa
# 2017-07-28 23:11:02,946-WARNING : 哈哈哈
# 文件:
# WARNING : 哈哈哈
再讲一点。
网站访问量大,日志很多几个G,有时候需要写脚本切割,有的程序可以自动切割
咱的logger里可以根据时间和大小进行切割
RotatingFileHandler管理文件大小,达到一定大小改名,依次创建文件。maxBytes指定文件大小
backupCount用于保留日志文件的个数
文件自动截断例子按大小
logging.handlers.RotatingFileHandler(filename="dfa",maxBytes=1,backupCount=3,encoding="utf8")
一共出现四个log,备份三个,显示最新的,把之前的删了,只保留3个
文件自动截断按时间:S 秒 M分 H小时 D天 W每星期 midnight每天凌晨
handlers.TimedRotatingFileHandler(filename="ds",when="S",interval=5,backupCount=3,encoding="utf8")
5秒截断
from logging import handlers
log1 = logging.getLogger("name1")
hand1 = logging.handlers.RotatingFileHandler(filename="fffff.log",
maxBytes=1,
backupCount=3,
encoding="utf-8")
# hand1 = logging.handlers.TimedRotatingFileHandler(filename="fffff.log",
# when='s',
# interval=1,
# backupCount=3)
log1.addHandler(hand1)
log1.warning("a")
log1.warning("b")
2.re模块
[\+\-]{2,} 和 (\+|\-){2,} 一样的
[\+\-]{0,1} 和 (\+|\-)? 一样的
正则表达式,匹配 “不全是空格” 怎么写? 答案: .*[^ ].*
re.match 从头开始匹配 match(pattern, string, flags=0)
re.search 匹配包含 search(pattern, string, flags=0)re.findall 把所有匹配到的字符放到以列表中的元素返回 findall(pattern, string, flags=0)re.split 以匹配到的字符当做列表分隔符 split(pattern, string, maxsplit=0, flags=0)re.sub 匹配字符并替换sub(pattern, repl, string, count=0, flags=0)
“\d+” "A" "asdfadfa" 次数 flags = re.I
flags = re.M
re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)S(DOTALL): 点任意匹配模式,改变'.'的行为import re
str1 = '123 S 456 S 789 S abc S def'
print(re.split('S', str1, maxsplit=0)) #['123 ', ' 456 ', ' 789 ', ' abc ', ' def']
print(re.split('S', str1, maxsplit=1)) #['123 ', ' 456 S 789 S abc S def']
print(re.split('S', str1, maxsplit=2)) #['123 ', ' 456 ', ' 789 S abc S def']
print(re.split('S', str1, maxsplit=3)) #['123 ', ' 456 ', ' 789 ', ' abc S def']
print(re.split('S', str1, maxsplit=4)) #['123 ', ' 456 ', ' 789 ', ' abc ', ' def']
print(re.split('S', str1, maxsplit=5)) #['123 ', ' 456 ', ' 789 ', ' abc ', ' def']
用的场景,经常做文字处理用的比较多,做字符串匹配的
精确匹配 模糊匹配
最基本的匹配:
import re
re.match("inet", "inet 1123sdfasdf")
match是从头开始匹配
匹配不上返回NONE
匹配上了返回<_sre.SRE_Match object; span=(0,4), match='inet'>
通过a.group()可以看到匹配到了哪些字段,动态规则可以看到很多
先看套路:
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'\S' 匹配非空白字符、
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","").groupdict("city") 结果{'province': '', 'city': '', 'birthday': ''}
re.search整个里面去搜
Python学习第二阶段Day2,模块subprocess、 logging、re的更多相关文章
- Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块
1.json/pickle 略. 2.shelve模块 import shelve # shelve 以key value的形式序列化,value为对象 class Foo(object): de ...
- Python学习第二阶段Day2,模块time/datetime、random、os、sys、shutil
1.Time. Datetime(常用) UTC时间:为世界标准时间,时区为0的时间 北京时间,UTC+8东八区 import time print(time.time()) # timestamp ...
- Python 调用系统命令的模块 Subprocess
Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...
- Python学习 Part4:模块
Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...
- Python学习日记 --day2
Python学习日记 --day2 1.格式化输出:% s d (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ...
- python学习之argparse模块
python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...
- Python学习day19-常用模块之re模块
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day18-常用模块之NumPy
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习第二阶段,Day2,import导入模块方法和内部原理
怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...
随机推荐
- 基于Jquery插件Uploadify实现实时显示进度条上传图片
网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们 ...
- D1 模拟赛
T1 note 数组开小 菜的真实 60分 题目大意: 一个字符串 分成若干段 使每段内都没有重复的字符 求最少的段数 思路: 可以贪心 #include<iostream> #inclu ...
- P4460 [CQOI2018]解锁屏幕
算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...
- 杂项-Java:JeePlus
ylbtech-杂项-Java:JeePlus 一个集成了代码生成器的java快速开发框架 1. 介绍返回顶部 1. 响应式开发 JeePlus采用了目前极为流行的扁平化响应式的设计风格,UI框架使用 ...
- cisco secure ACS服务器搭建
网上下载Cisco Secure Access Control System 5.2.iso的镜像,总共有两部分 http://pan.baidu.com/disk/home#path=%252FCi ...
- 17_activity任务栈和启动模式
夜神安卓模拟器. 如果从第一个页面开启另外一个页面,只要不去调finish()方法咱们上一个页面它是不会退出的,它会留在底下.留在底下的话它设计了这样一个模式就是为了维护一个比较好的用户体验,你的仪器 ...
- webapp填坑记录
网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...
- java Class.getResource和ClassLoader.getResource
http://www.cnblogs.com/wang-meng/p/5574071.html http://blog.csdn.net/earbao/article/details/50009241 ...
- [转]C++常用字符串分割方法实例汇总
本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考.具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用. 一.用strtok函数进行字符串分割 原 ...
- Windows Server 2008 R2关闭FTP服务
公司在ZJ的项目给了一台互联网可以访问的测试服务器,但是只给了三个访问端口,而且还做了映射. 映射信息如下:[1050->3389,1051->50000,1053->21] 其中1 ...