一、Logging模块日志

1、logging导入

  Import logging

2、知道5个日志级别的等级关系

Debug->info->warning->error->critical

3、输出5种日志的基本方式

logging.debug ('xxxx')
logging.info('xxx') logging.waring('xxx')
logging.error('xxx')
logging.critical('xxxx')

4、默认情况下5中基本方式的输出情况,只输出了warning/error/critical,即只输出了warining之后的日志

logging.debug('it is debug')
logging.info('it is info')
logging.warn('it is warm')
logging.error('it is error')
logging.critical('it is critical') ------------ WARNING:root:it is warm
ERROR:root:it is error
CRITICAL:root:it is critical

5、修改默认日志级别的方式 basicconfig

logging.basicConfig(level=logging.DEBUG)

6、basicconfig的深入学习

6.1 设置日志输入到文件中,使用filename

filename='mylog.log'

6.2 设置日志的输出格式 如添加日志时间

%(asctime)s 时间

%(filename)s 文件名

%(lineno)d 行数

%(levelname)s 日志等级

%(message)s 日志内容

%(funcname)s 函数名

#format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

import logging
import datetime
print('5个级别,默认输出warm及以上的日志') logging.basicConfig(
filename='log.log',
level=logging.DEBUG,
datefmt='%Y/%m/%d %H:%M:%S %b,%a',
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
#此时屏幕上不输出 还能输出进程号 先知道就行 logging.debug('it is debug')
logging.info('it is info')
logging.warn('it is warm')
logging.error('it is error')
logging.critical('it is critical') --------- 2011/01/01 22:19:42 Mar,Sat 20110116_logging_mod_1.py[line:10] DEBUG it is debug
2011/01/01 22:19:42 Mar,Sat 20110116_logging_mod_1.py[line:11] INFO it is info
2011/01/01 22:19:42 Mar,Sat 20110116_logging_mod_1.py[line:12] WARNING it is warm
2011/01/01 22:19:42 Mar,Sat 20110116_logging_mod_1.py[line:13] ERROR it is error
2011/01/01 22:19:42 Mar,Sat 20110116_logging_mod_1.py[line:14] CRITICAL it is critical

7、logging模块的高级应用 4个类的使用

了解logging模块的4个类:

Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:

logger提供了应用程序可以直接使用的接口;

handler将(logger创建的)日志记录发送到合适的目的输出;

filter提供了细度设备来决定输出哪条日志记录;

formatter决定日志记录的最终输出格式。

7.1  定义logger,设置level总开关

import logging

#step 1
logger1=logging.getLogger('logger1')#实体化一个logger 可以给其他模块是使用的
logger1.setLevel(logging.DEBUG)#定义日志级别 总开关 如果这里做了限定只打印error之后 下面的日志等级也无法打印error之前的 logger2=logging.getLogger('logger2')
logger2.setLevel(logging.DEBUG)

7.2 定义handle 指定日志输出的位置,屏幕,文件,还能通过邮件发送,本文不描述邮件发送的方法

#step2 定义handler

#7.2.1

#屏幕handler logging.StreamHandler()
scream_handler=logging.StreamHandler()
scream_handler.setLevel(logging.DEBUG) #7.2.2 #文件handler logging.FileHandler('') file_handler=logging.FileHandler('logxxx.log')
file_handler.setLevel(logging.DEBUG)

7.3 定义formatter 定义输出内容的格式

#文件formatter
f_formater=logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s','%Y%b%d-%H:%M:%S') #屏幕formater
s_formater=logging.Formatter('%(asctime)s-%(levelname)s-%(message)s','%Y-%m-%d/%X')

7.4 formatter与handler关联

#step4 formatter与handler关联

file_handler.setFormatter(f_formater)
scream_handler.setFormatter(s_formater)

7.5 #给logger对象添加handler 一个logger可以添加多个handler

logger1.addHandler(file_handler)
logger2.addHandler(file_handler)
logger2.addHandler(scream_handler) logger1.debug('loger1 ******************debug')
logger1.info('loger1 ******************infor')
logger1.warning('logger1 ******************warning')
logger1.error('logger1 ******************error')
logger1.critical('logger1 ******************critical')
logger2.debug('loger2 debug')
logger2.info('loger2 infor')
logger2.warning('logger2 warning')
logger2.error('logger2 error')
logger2.critical('logger2 critical') ------------------------------------------------ 2018-03-04/01:57:26-DEBUG-loger2 debug 2018-03-04/01:57:26-INFO-loger2 infor 2018-03-04/01:57:26-WARNING-logger2 warning 2018-03-04/01:57:26-ERROR-logger2 error 2018-03-04/01:57:26-CRITICAL-logger2 critical

8、日志切割

from logging import handler

#8.1 按时间切割

TimedRotatingFileHandler(filename='time.log',when='M',interval=1,backupCount=2,encoding='utf-8')

#8.2 按大小切割

.RotatingFileHandler(filename='file.log',maxBytes=16,backupCount=5,encoding='utf-8')

import logging
from logging import handlers
import time timelog=logging.getLogger('time.log')
timelog.setLevel(logging.DEBUG)
filelog=logging.getLogger('file.log')
filelog.setLevel(logging.DEBUG) time_handler=handlers.TimedRotatingFileHandler(filename='time.log',when='M',interval=1,backupCount=2,encoding='utf-8')
time_handler.setLevel(logging.DEBUG)
file_handler=handlers.RotatingFileHandler(filename='file.log',maxBytes=16,backupCount=5,encoding='utf-8')
file_handler.setLevel(logging.DEBUG) formatter1=logging.Formatter('%(asctime)s-%(levelname)s-%(message)s','%Y-%m-%d/%X')
time_handler.setFormatter(formatter1)
file_handler.setFormatter(formatter1) timelog.addHandler(time_handler)
filelog.addHandler(file_handler) for i in range(8): print(i) timelog.debug('')
time.sleep(10) ------------------------------------
filelog.debug('这是一个日志测试')
filelog.debug('测试日志大小自动切割功能')
filelog.debug('测试结束')

二、re模块 正则表达式

Re 模块 只是把匹配的那一段内容截取出来 不会显示前后内容

1、re模块

用于正则表达式对字符串的处理

2、match与group的使用

match函数

规定:从头开始匹配 使用group能查看 只能匹配一个

使用语法:matach (规则 ,字符串)

输出方式:group()输出

>>> a=re.match('ip','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group()
---------------------
'ip'

3、Search与findall

规定:search和findall都全文匹配检索,相比于match而言,search与findall更为常用。

使用方法

re.search(‘条件’,’string’)

re.findall(‘条件’,’string’)

输出方式:

Search的匹配结果和match一样,需要使用.group()来输出

Findall的结果赋值给变量后,可以直接输出,变现为一个列表的形式

>>> a=re.findall('.{3,6}','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a
--------------------------
['ipaddr', ' 192.1', '68.1.1', ' mask ', '255.25', '5.255.']

4、’.’ 点的使用 表示匹配除了\n之外的任意一个字符 此处先不考虑flag

>>> a=re.match('.','inet 127.0.0.1 netmask 255.0.0.0')
>>> a.group()
'i' >>> a=re.match('...','inet 127.0.0.1 netmask 255.0.0.0')
>>> a.group()
'ine' >>> a=re.match('....','inet 127.0.0.1 netmask 255.0.0.0')
>>> a.group()
'inet'

5、^与$的使用 此处可以设置flag 暂时不考虑

^表示匹配开头,和match一致

$匹配结尾

a6=re.search('k$','are you ok')
print(a6.group())

6、*匹配前一个字符 0次或者多次 优先多次

7、+匹配前一个字符1次或者多次

* 与+号 的对比 * 0次可以匹配到空串 (最长匹配原则,会尽量匹配到最长再结束)

>>> a=re.match('\w+','@ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a
>>> print(a)#w表示A-Z及数字,特殊字符无法匹配,所以此处返回null
None >>> a=re.match('\w*','@ipaddr 192.168.1.1 mask 255.255.255.0') >>> a.group()#*匹配0个也属于匹配,所以不会返回null,会返回空字符串 ' ' >>> print(a)
<_sre.SRE_Match object; span=(0, 0), match=''>
>>>
>>> a=re.match('\w*','ipad@dr 192.168.1.1 mask 255.255.255.0')
>>> a.group() 'ipad' #最长匹配,一直匹配到无法匹配了

8、?匹配0次或者1次 优先1次

>>> a=re.match('\w?','@ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group()
----------------------------
''#空串
  1. 9、{x } 匹配前一规则多少次

>>> a=re.match('.{3}','ipaddr 192.168.1.1 mask 255.255.255.0')

>>> a.group()
'ipa' >>> a=re.match('.{0}','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group() '' >>> a=re.match('.{6}','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group()
'ipaddr' >>>

10、{x,y} 能匹配长的尽量匹配长的

>>> a.group()
'ipaddr'
>>>
>>> a=re.findall('.{3,6}','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a
['ipaddr', ' 192.1', '68.1.1', ' mask ', '255.25', '5.255.']

11、x|y 满足x或y任意一个条件都可以 同时满足 匹配左边

>>> a=re.match('ip|IP','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group()
'ip' >>> a=re.match('ip|IP','IPaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group()
'IP' >>> a=re.match('.{3}|.{6}','ipaddr 192.168.1.1 mask 255.255.255.0')
>>> a.group()
'ipa'

12、分组 group groups groupdict ?P<city>的使用

我们可以使用()对匹配规则进行分组

匹配结果的不同输出方式

group:所有匹配结果组合成一个string输出

Groups:将匹配结果以括号为切割分成不同的段,以元组形式展现

Groupdict()与?P<自定义标题>结合,可以组成key-value形式的字段,便于处理

下面以身份证号码来演示结果:

a34=re.search('(?P<省份>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{6})','')

print(a34.groups())
print(a34.group())
print(a34.groupdict()) ------------------------- ('', '', '')
550101201811
{'省份': '', 'city': '', 'birthday': ''}

13、\A \Z的表示含义 等同于^ $

注意点:\A \Z ^ $时,需要从整个字符串的头尾入手来分析

re.search('\A\d.*\d\Z','333199995555alex')

>>> a=re.search('\A\d.*\d\Z','333199995555alex3')
>>> print(a) <_sre.SRE_Match object; span=(0, 17), match='333199995555alex3'>
>>> a.group()
'333199995555alex3'
>>>

注意:这个是易错点

14、\d与\D 的表示含义0-9 与非0-9

15、\w与\W 的表示含义A-Z0-9a-z与 非A-Z0-9a-z

16、\s 的表示含义 匹配空白符号 包括\n \t \r

>>> re.findall('\s','\naaa\tbajidfi\radjkfi\n')
['\n', '\t', '\r', '\n']
re.findall('\s','\naaa\tbajidfi\radjkfi\n')

17、[a-x]这种写法与[^a-x]的写法,此处^表示非的意思,需要注意

对于[^]非的理解[^()]指 除了括号以外的任意字符 [^0-9]除了0-9以外的任意字符

18、findall 与split切割字符串的用法对比及split与()括号的结合使用

Split进行切割,会有空串出现 Split进行切换,可以结合括号来对字符串进行分段,且保留被匹配的部分 注意空串的存在

>>> re.findall('\d+','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n')
['', '', '', '', '', '', '', '', '', '', '', '', ''] >>> re.split('\D+','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n')
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
>>> >>> re.split('(\D+)','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n') ['', 'ad', '', 'jkjojo', '', 'jkoj', '', 'kjo', '', 'jl', '', 'jnu', '', 'n', '', 'nl', '', 'n', '', 'kj', '', 'hkj', '', 'n', '', 'k', '', 'n', ''] >>>

19、re.sub 替换内容

 #与split一样,会有空串出现,被替换为相应的字符,需要注意

#语法sub(‘规则’,’替换成的形势’,’需要被处理的字符串’,‘替换次数’,‘次数不写为全部替换’)

>>> re.sub('\D+','|','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n')

'|23123|123|545|6|4|3|4|5|1|4|4|213|4|'

>>> re.sub('\D+','|','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n',count=2)

'|23123|123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n'

>>> re.sub('\D+','|','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n',count=4)

'|23123|123|545|6jl4jnu3n4nl5n1kj4hkj4n213k4n'

>>> re.sub('\D+','|','ad23123jkjojo123jkoj545kjo6jl4jnu3n4nl5n1kj4hkj4n213k4n')

'|23123|123|545|6|4|3|4|5|1|4|4|213|4|'

>>>

19、反斜杠的困扰

一个\组成\'

两个\\ 组成正则表达式一个\ 也是有歧义

三个\\\ 组织一个正则表达式的\及一个转义\'

四个\\组成两个正则表达式\\ 变成一个真实的字符串\ 此类可以用r来解决

20、三个flag的使用 flag I、M、S

Flags=re.I
#含义:re.I 忽略大小写 >>> a=re.match('ip','IPADDR 192.168.1.1',flags=re.I)
>>> a.group()
'IP'
>>> a=re.match('ip','IPADDR 192.168.1.1')
>>> print(a)
None
>>> Flags=re.M 多行模式 影响^ $
Flags=re.S 点任意匹配模式 >>> a=re.match('^\d.+\d$','3aaaaa4\nddddd5',flags=re.M)
>>> a.group()
'3aaaaa4' >>> a=re.match('^\d.+\d$','3aaaaa4\nddddd5')
>>> a.group() Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
#注意这里为什么报错 >>> a=re.match('^\d.+\d$','3aaaaa4\nddddd5',flags=re.S)
>>> a.group()
'3aaaaa4\nddddd5' >>>

三、堆栈与队列的操作

1、队列与堆栈的浅认识,队列先进先出、堆栈先进后出。

2、使用列表的insert(0)、append、pop、pop(0) 分别实现队列和堆栈的入队出队,入栈出栈

python笔记-8(logging模块、re模块、栈与队列)的更多相关文章

  1. guxh的python笔记十:包和模块

    1,包和模块 包package:本质就是一个文件夹/目录,必须带一个__init.__.py的文件 模块module:.py结尾的python文件 2,导入方法 import pandas, coll ...

  2. python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议

    socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...

  3. 剑指offer笔记面试题9----用两个栈实现队列

    题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在尾部插入节点和在队列头部删除节点的功能. 测试用例: 往空的队列里添加.删除元素. ...

  4. python笔记7 logging模块 hashlib模块 异常处理 datetime模块 shutil模块 xml模块(了解)

    logging模块 日志就是记录一些信息,方便查询或者辅助开发 记录文件,显示屏幕 低配日志, 只能写入文件或者屏幕输出 屏幕输出 import logging logging.debug('调试模式 ...

  5. Python笔记(二十九)_模块

    模块 在Python中,一个.py文件就是一个模块 if __name__ == '__main__':所有模块都有一个 __name__ 属性,__name__ 的值取决于如何应用模块 run当前文 ...

  6. [剑指offer]09用两个栈实现队列插入和删除操作,C++实现

    原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...

  7. Python自建logging模块

    本章将介绍Python内建模块:日志模块,更多内容请从参考:Python学习指南 简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = ...

  8. python模块: hashlib模块, configparse模块, logging模块,collections模块

    一. hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用 ...

  9. python学习笔记系列----(四)模块

    这一章主要是叙述了python模块的概念以及包的概念,还有它们的使用:收获也是大大的. 提起python文件,经常会听到3个名词,python脚本,python模块,python包.脚本的概念是从py ...

  10. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

随机推荐

  1. RabbitMQ 之消息确认机制(事务+Confirm)

    概述 在 Rabbitmq 中我们可以通过持久化来解决因为服务器异常而导致丢失的问题,除此之外我们还会遇到一个问题:生产者将消息发送出去之后,消息到底有没有正确到达 Rabbit 服务器呢?如果不错得 ...

  2. htop 比top更好用的top

    安装 sudo apt-get install htop 使用 htop

  3. Tomcat 环境搭建

    最近在工作之余,看到了一些 Tomcat 的基础资料,感觉蛮好.同时也回忆起自己刚毕业要参加工作那会对 Tomcat 也是各种资料各种查,实属不易.为此,针对最近整理的一些基础,把 Tomcat 基本 ...

  4. SpringBoot 玩转读写分离

    环境概览 前言介绍 Sharding-JDBC是当当网的一个开源项目,只需引入jar即可轻松实现读写分离与分库分表.与MyCat不同的是,Sharding-JDBC致力于提供轻量级的服务框架,无需额外 ...

  5. jquery.chosen.js下拉选择框美化插件项目实例

    由于之前使用的bootstrap-select插件是建立在bootstrap基础上的,实际使用到项目中的时候,与我们使用的ace-admin(基于bootstrap)存在样式冲突,导致下拉框的样式发生 ...

  6. ctci1.3

    ; i < len; i++){         if(str0[i] != str1[i])             return false;     }          return t ...

  7. HDU-4679-树的直径(树形dp)

    Terrorist’s destroy Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  8. 【转】ubuntu下如何将笔记本自带的键盘关闭

    想必大家都经历过这样的情况:在使用usb接口的外接键盘的时候,很容易按到笔记本自带的键盘,从而导致输入错误.尤其是你将外接键盘放在笔记本键盘上面的时候.怎么解决这个问题呢? 搜索之后,找到了答案.注意 ...

  9. Java复习5.面向对象

    Java 复习5面向对象知识 20131004 前言: 前几天整理了C++中的面向对象的知识,学习Java语言,当然最重要的就是面向对象的知识,因为可以说Java是最正宗的面向对象语言,相比C++,更 ...

  10. 三、dbms_pipe(类似UNIX系统的管道)

    1.概述 说明:Oracle管道类似UNIX系统的管道,但不采用OS机制实现,管道信息被缓存到SGA中,当关闭例程时会丢失管道信息,建立公用管道所有数据库用户都可访问,私有管道只能由建立这访问.作用: ...