一,复习

# random: random() randint() choice() sample()

# 序列化:对象需要持久化存储或传送 对象 => 字符串


# json: 用于传输

# -- 1.支持{} [] int float bool str null
# -- 2.是{}与[]的嵌套组合,最外层只能有一个根:要么所有数据由{}起始包裹,要么由[]起始包裹,就是单一1支持的类型数据
# -- 3.字符串必须由""包裹 # pickle: 用于存储,支持所有数据类型,采用二进制进行操作
# 序列化:dump dumps
# 反序列化:load loads # shelve: 采用字典形式进行序列化与反序列化
shv_dic = shelve.open('序列化文件')
# 序列化
shv_dic[key] = value
# 反序列化
shv_dic[key]
# open('序列化文件', writeback=True) 可以是序列化的值为可变类型,更新其值,能实时同步到文件 # shutil:操作文件与文件夹的模块 # 加密:碰撞解密
# hashlib:lock_obj = hashlib.md5('创建对象时的数据可有可无')
# hmac: lock_obj = hmac.new('必须提前给数据') # 更新加密的数据:lock_obj.update('二进制的数据'.encode('utf-8'))
# 获取加密结果:lock_obj.hexdigest()

二,logging模块

'''
日志:日常的流水=》日志文件,将程序运行过程中的状态或数据操作进行记录,且记录到日志文件中
为什么要记录日志:优化程序,更好的服务于上帝 # logging模块:
1,一共分为五个打印级别
2,级别本身没有代表信息重要性的区别,只是包含级别信息,可以约定日志的重要性 '''''
import logging logging.debug('debug msg')
logging.info('info msg')
logging.warning('warning msg') #WARNING:root:warning msg
# logging模块.warn('warning msg') #已经没用了
logging.error('error msg') #ERROR:root:error msg
logging.critical('critical msg') #CRITICAL:root:critical msg
# logging模块.fatal('critical msg') #CRITICAL:root:critical msg

三,标准三流

import sys

print(sys.stdout)   #<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>

'''
标准输出流 sys.stdout:print()的底层实现'''
sys.stdout.write('123\n')
sys.stdout.write('呵呵\n')
print('哈哈',end='')
print() import logging '''标准错误流 sys.stderr:异常及logging默认打印方式的底层'''
logging.critical('msg')
print(sys.stderr) #<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> sys.stderr.write('输出的信息\n') '''标准输入流 sys.stdin:input 的底层'''
print(sys.stdin) #<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'> res = sys.stdin.readline()
print(res) res = sys.stdin.read(3)
print(res) res = input()
print(res)

四,四大成员

import logging

'''1,新建打印作者'''
logger = logging.getLogger('Owen') '''2,创建句柄,输出的位置'''
stream_handler = logging.StreamHandler()
a_file_handler = logging.FileHandler('a.log')
b_file_handler = logging.FileHandler('b.log') '''3,打印者绑定句柄'''
logger.addHandler(stream_handler)
logger.addHandler(a_file_handler)
logger.addHandler(b_file_handler) '''4,设置格式'''
fmt1 = logging.Formatter('%(asctime)s - %(msg)s')
fmt2 = logging.Formatter('%(asctime)s [%(name)s] -%(msg)s') '''5,为句柄绑定输出格式'''
stream_handler.setFormatter(fmt2)
a_file_handler.setFormatter(fmt1)
b_file_handler.setFormatter(fmt2) logger.critical('msg')

五,logging基本配置

import logging
import sys '''logging配置:格式化输出 1:输出的方式 2,输出的格式 3,输出的位置'''
h1 = logging.StreamHandler() #打印到终端
h2 = logging.FileHandler('d.log') #打印到文件 logging.basicConfig(
# filename = 'my.log',
# filemode = 'w',
# stream = sys.stderr, #往控制台打印采用具体的输出流
format = '%(asctime)s [%(levelname)s]-%(name)s: %(message)s',
datefmt = '%Y-%m-%d %H-%M-%S',
level = logging.DEBUG, #10,代表DEBUG及DEBUG以上级别都能输出
handlers=[h1,h2]
) logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

六,logging简单操作

# 1.配置
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'D:\Python_Project\ClassRoom\day20\logging模块\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']
}
}
} # 2.加载配置
import logging.config
logging.config.dictConfig(LOGGING_DIC) # 3.使用
log = logging.getLogger('o_owen')
log.warning('')

六,多logger共存

import logging

1,创建logger
log1 = logging.getLogger('Owen')
log2 = logging.getLogger('Zero')
r_log = logging 2,logger设置级别
log1.setLevel(logging.DEBUG) 3,设置句柄
h1 = logging.StreamHandler() '''
4,设置句柄级别:
——系统句柄默认级别warning
——自定义的句柄级别默认同logger,也可以在logger基础上再加以限制
'''
'''log1可以打印DEBUG以上的信息,但往不同位置打印,采用不同句柄的二次级别限制'''
h1.setLevel(logging.DEBUG) h2 = logging.FileHandler('c.log')
h2.setLevel(logging.WARNING) '''5,logger添加句柄'''
log1.addHandler(h2)
log1.addHandler(h1) log1.debug('debug')
log1.info('info')
log1.warning('warning')
log1.error('error')
log1.critical('critical') log2.critical('') r_log.critical('')

七,re 模块:

'''
re:就是正则,是有语法规则的字符串,用来匹配目标字符串的
'''''
import re
data = 'https://www.baidu.com' '''
需求:判断该数据是否是合法的url链接
合法的url应该满足:以https:// | http:// 开头 且以 com | cn结尾
字符串匹配:根据你的规定书写字符串与目标字符串进行配对,如果配对称成功,代表目标字符串满足需求
正则表达式:是一个可以同时制定多个规则的字符串
''' res = re.findall('https://www.baidu.com',data)
print(data) '''将目标字符串中的所有数字找出'''
data = '123abc哈哈66'
res = re.findall(r'\d',data) #\d就代表数字 ['1', '2', '3', '6', '6']
print(res) '''找字母'''
res = re.findall('[a-z]',data) #['a', 'b', 'c']
print(res)

八,正则语法:

'''单个字符'''''
import re #re.I 不区分大小写的匹配
print(re.findall(r'a','123abc哈哈ABC',flags=re.I)) #['a', 'A'] #a|b a或b单个字符
print(re.findall(r'a|b','123abc哈哈ABC',flags=re.I)) #['a', 'b', 'A', 'B'] #[a,b] a或,或b 单个字符
print(re.findall(r'[a,b]','123a,bc哈哈ABC',flags=re.I)) #['a', ',', 'b', 'A', 'B'] #[^ab] 非a及非b的所有单个字符
print(re.findall(r'[^ab]','123a,bc哈ABC',flags=re.I)) #['1', '2', '3', ',', 'c', '哈', 'C'] #[a-z] 所有单个小写字母 [A-Z]所以单个大写字母 [0-9]所有单个数字
print(re.findall(r'[a-z]','123a,bc哈ABC')) #['a', 'b', 'c']
print(re.findall(r'[0-9]','123a,bc哈ABC')) #['1', '2', '3'] #所有小写大写数字单个字符
print(re.findall(r'[a-z]|[A-Z]|[0-9]','123a,bc哈ABC')) #['1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C']
print(re.findall(r'[a-zA-Z0-9]','123a,bc哈ABC')) #['1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C'] # \d 单个数字 == [0-9]
print(re.findall(r'\d','123a,bc哈ABC')) #['1', '2', '3'] # \w == [A-Za-z0-9] 常见的汉字理解为单个字母
print(re.findall(r'\w','123a,bc哈ABC')) #['1', '2', '3', 'a', 'b', 'c', '哈', 'A', 'B', 'C'] # \s 单个空:空格,制表符,换页符等
# print('\f\n\t\r\v')
print(re.findall(r'\s','\f\n\r\t\v')) #['\x0c', '\n', '\r', '\t', '\x0b'] # \D 就是\d的对立面:非数字的所有单个字符 \W就是\w的对立面 \S就是\s的对立面
print(re.findall(r'\D','123a,bc哈ABC')) #['a', ',', 'b', 'c', '哈', 'A', 'B', 'C'] #单个汉字
print(re.findall(r'[\u4e00-\u9fa5]','123a,bc哈ABC')) #['哈']

九,正则匹配步骤:

import re

print(re.findall(r'\\','a\d\p\\'))      #['\\', '\\', '\\']
print(re.findall(r'\\',r'a\d\p\\')) #['\\', '\\', '\\', '\\'] print(re.findall(r'\n','\n')) #['\n']
print(re.findall(r'\d','\d')) #[]
print(re.findall(r'\\d','\d')) #['\\d'] #底层实现
re_obj = re.compile(r'\n') #转换成匹配换行符的正则对象
res = re_obj.findall('\n')
print(res) #['\n'] re_obj = re.compile(r'\\d') #转换成匹配\d 的正则对象
res = re_obj.findall('\d')
print(res) #['\\d'] re_obj = re.compile(r'\d') #转换成匹配数字的正则对象
res = re_obj.findall('\d') #\d不是数字
print(res) #[] re_obj = re.compile(r'\\n') #转换成匹配数字的正则对象
res = re_obj.findall('\n') #代表换行,不能被匹配
print(res) #[]
res = re_obj.findall(r'\n') #就代表\n,能被匹配
print(res) #['\\n']

十,多个字符:

import re

#.会匹配\n以外的所有单个字符
print(re.findall(r'.','*\_+=\n\t\r')) #['*', '\\', '_', '+', '=', '\t', '\r']
# re.S会让.匹配所有单个字符
print(re.findall(r'.', '*\_+=\n \r\t', re.S)) #['*', '\\', '_', '+', '=', '\n', ' ', '\r', '\t'] #明确个数的重复
#{n}
print(re.findall(r'a', 'aaabbb')) #['a', 'a', 'a']
print(re.findall(r'a{2}', 'aaabbb')) #['aa']
print(re.findall(r'ab', 'aabbababab')) #['ab', 'ab', 'ab', 'ab']
print(re.findall(r'a{2}b{2}', 'aabbababab')) #['aabb']
print(re.findall(r'ab{2}', 'aabbababab')) #['abb'] #{n,} 匹配n到无数个,题中最少匹配abb,贪婪匹配,能被匹配多个 ,优先匹配多的
print(re.findall(r'ab{2,}', 'ababbabbbabbbb')) #['abb', 'abbb', 'abbbb'] #{,n}匹配0-n个,ab{,2},优先abb,没有ab也行,如果还有,a也会被匹配上
print(re.findall(r'ab{,2}', 'aababbabbbabbbb')) #['a', 'ab', 'abb', 'abb', 'abb'] #{n,m}匹配n到m个,ab{1,3}优先会匹配abbb ,在考虑abb,ab
print(re.findall(r'ab{1,3}', 'ababbabbbabbbb')) #['ab', 'abb', 'abbb', 'abbb'] # 特殊符号的重复
# *:匹配0到无数个
print(re.findall(r'ab*', 'aababbabbbabbbb')) #['a', 'ab', 'abb', 'abbb', 'abbbb'] # +:匹配1到无数个
print(re.findall(r'ab+', 'aababbabbbabbbb')) #['ab', 'abb', 'abbb', 'abbbb'] # ?:匹配0到1个
print(re.findall(r'ab?', 'aababbabbbabbbb')) #['a', 'ab', 'ab', 'ab', 'ab'] #需求:匹配所有单词
print(re.findall(r'[a-z]+', 'abc def hello print')) #['abc', 'def', 'hello', 'print']
print(re.findall(r'[a-z]+\b', 'abc def hello print')) #['abc', 'def', 'hello', 'print'] #匹配以c结尾的
print(re.findall(r'[a-z]*c', 'abc def hello print acb zc')) #['abc', 'ac', 'zc']
print(re.findall(r'[a-z]*c\b', 'abc def hello print acb zc')) #['abc', 'zc'] # 问题点:分组,一会解决
print(re.findall(r'(?:ab){2}', 'aabbababab')) # ['abab']

十一,多行匹配:

import re
s = """http://www.baidu.com
https://sina.com.cn
https://youku.com
haam
abchttp://www.oldboy.com
"""
q = """http://www.baidu.com
https://sina.com.cn
https://youku.com
haam
abchttp://www.oldboy.com
"""
#将url都匹配出来=》分组
print(re.findall(r'(?:http://|https://).+(?:com|cn)',s))
#['http://www.baidu.com', 'https://sina.com.cn', 'https://youku.com', 'http://www.oldboy.com'] # ^代表以什么开头,$代表以什么结尾,必须结合flags=re.M来完成匹配
print(re.findall(r'^http.+com$',q,flags=re.M)) #['http://www.baidu.com', 'https://youku.com']

十二,分组匹配:

import re

url = 'https://www.baidu.com, http://www.youku.com'

#需求:拿到url的域名的 baidu,youku
print(re.findall(r'www.([a-z]+).com',url)) #['baidu', 'youku'] # () 代表分组
#findall 匹配,如果匹配规则有分组语法,只存放分组结果
print(re.findall(r'(www).([a-z]+).com',url)) #[('www', 'baidu'), ('www', 'youku')] #分组的顺序编号按照左括号的前后顺序
print(re.findall(r'((w)ww).([a-z]+).com',url)) #[('www', 'w', 'baidu'), ('www', 'w', 'youku')] #findall是全文匹配,可以从任意位置开始,匹配多次
#match非全文匹配,必须从头开始匹配,只能匹配一次 '''
专门处理分组的方法:分组,分组编号,有名分组,取消分组
取消分组:必须写(),但是()为分组语法,我们只是想通过()将一些数据作为整体,所以()必须,在取消分组即可
(?:):取消分组只是作为整体 (?p<name>):有名分组
'''
url = 'www.baidu.com,www.youku.com'
res = re.match(r'((?:www).(?P<name>[a-z]+).com)',url)
print(res) #<re.Match object; span=(0, 13), match='www.baidu.com'> print(res.group(1)) #www.baidu.com
print(res.group(2)) #baidu
print(res.group('name')) #baidu

十三,贪婪与非贪婪:

import re
'''
贪婪模式:尽可能多的匹配
{n,}
{,n}
{n,m}
*
+
?
''' '''
非贪婪模式:尽可能少的匹配
{n,}?
{,n}?
{n,m}?
*?
+?
??
''' print(re.findall(r'ab{0,}', 'aababbabbb')) #['a', 'ab', 'abb', 'abbb'] print(re.findall(r'ab{0,}?', 'aababbabbb')) #['a', 'a', 'a', 'a'] print(re.findall(r'ab{,3}', 'aababbabbb')) #['a', 'ab', 'abb', 'abbb']
print(re.findall(r'ab{,3}?', 'aababbabbb')) #['a', 'a', 'a', 'a'] print(re.findall(r'ab{1,3}', 'aababbabbb')) #['ab', 'abb', 'abbb']
print(re.findall(r'ab{1,3}?', 'aababbabbb')) #['ab', 'ab', 'ab'] print(re.findall(r'ab*', 'aababbabbb')) #['a', 'ab', 'abb', 'abbb']
print(re.findall(r'ab*?', 'aababbabbb')) #['a', 'a', 'a', 'a'] print(re.findall(r'ab+', 'aababbabbb')) #['ab', 'abb', 'abbb']
print(re.findall(r'ab+?', 'aababbabbb')) #['ab', 'ab', 'ab'] print(re.findall(r'ab?', 'aababbabbb')) #['a', 'ab', 'ab', 'ab']
print(re.findall(r'ab??', 'aababbabbb')) #['a', 'a', 'a', 'a'] s = '<a>s</a><a>sdf</a><a></a>'
print(re.findall(r'<.*>',s)) #['<a>s</a><a>sdf</a><a></a>']
print(re.findall(r'<.*?>',s)) #['<a>', '</a>', '<a>', '</a>', '<a>', '</a>'] print(re.findall(r'</.*?>',s)) #['</a>', '</a>', '</a>']
print(re.findall(r'<.*?>',s)) #['<a>', '</a>', '<a>', '</a>', '<a>', '</a>']

十四,其他方法:

import re

#字符串拆分
s = 'a b ac def'
print(s.split(' ')) #['a', 'b', 'ac', 'def'] #正则拆分
s = 'a b,ac@def'
print(re.split(r'[ ,@]',s)) #['a', 'b', 'ac', 'def'] s = 'python abc python'
print(re.sub('python','Python',s)) #Python abc Python
print(re.sub('python','Python',s,count = 1)) #Python abc python #结合分组可以完成信息的重组与替换
s = 'day a good!!!'
print(re.sub('(day) (a) (good)',r'tody is \2 \3 \3 \1',s)) #tody is a good good day!!!

logging ,re 模块的更多相关文章

  1. logging 日志模块学习

    logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...

  2. logging日志模块

    为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...

  3. python 自动化之路 logging日志模块

    logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...

  4. 第四十五节,logging日志模块

    用于便捷记录日志且线程安全的模块 单文件日志 basicConfig()模块函数 功能:创建日志文件和写日志模式[有参] 使用方法:模块名称.basicConfig(filename="日志 ...

  5. logging 模块 与 logging 固定模块

    import logging # 1. 控制日志级别# 2. 控制日志格式# 3. 控制输出的目标为文件logging.basicConfig(filename='access.log', forma ...

  6. day31 logging 日志模块

    # logging 日志模块 ****** # 记录用户行为或者代码执行过程 # print 来回注释比较麻烦的 # logging # 我能够“一键”控制 # 排错的时候需要打印很多细节来帮助我排错 ...

  7. logging日志模块的使用

    logging日志模块的使用 logging模块中有5个日志级别: debug 10 info 20 warning 30 error 40 critical 50 通常使用日志模块,是用字典进行配置 ...

  8. Python入门之logging日志模块以及多进程日志

    本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...

  9. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  10. Python logging(日志)模块

    python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...

随机推荐

  1. Oracle 正则化

    摘抄自:http://www.cnblogs.com/scottckt/archive/2012/10/11/2719562.html ORACLE中的支持正则表达式的函数主要有下面四个: 1,REG ...

  2. HDFS Java API

    HDFS Java API 搭建Hadoop客户端与Java访问HDFS集群

  3. bzoj 4542 [Hnoi2016]大数 (坑)

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...

  4. AtCoder Grand Contest 017 A

    Problem Statement There are N bags of biscuits. The i-th bag contains Ai biscuits. Takaki will selec ...

  5. The 17th Zhejiang University Programming Contest Sponsored by TuSimple A

    Marjar Cola Time Limit: 1 Second      Memory Limit: 65536 KB Marjar Cola is on sale now! In order to ...

  6. EJB Timer Service is not available. Timers for application with id 95795415990861824 will not be deleted

    delete follows:glassfish\domains\domain1\applications\ejb-timer-service-appglassfish\domains\domain1 ...

  7. IOS-关闭(退)键盘事件--转

    方法: 1.手势(触背景)关闭键盘 -(void)tapBackground //在ViewDidLoad中调用{    UITapGestureRecognizer * tap = [[UITapG ...

  8. Suricata的Reputation

    见官网 https://suricata.readthedocs.io/en/latest/reputation/index.html Docs » 9. Reputation Edit on Git ...

  9. 【转】哪个更快:Java堆还是本地内存

    译文出处: shenzhang   原文出处:原文链接 使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆 ...

  10. ios 苹果原生系统定位 CLLocationManager

    首先要干这些事 下面的方法亲测可用 ------------------------------------------------------------ DNLogFUNC //初始化位置管理对象 ...