logging模块.
collections模块.
time模块.
random模块.
logging 模块
logging 日志
记录.花钱的,(淘宝)败家的,
访问的记录,
员工信息,debug等等都需要日志.
1,被动触发: 与异常处理配合.访问记录.
2, 主动触发:检测运维人员输入的指令,检测服务器的重要信息,访问记录.等等.
高配版:
# 第一版:只输入文件中. # import logging # logger = logging.getLogger() # 创建logger对象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 创建文件句柄 # # # 吸星大法 # logger.addHandler(fh) # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message') # 第二版:文件和屏幕都存在. # import logging # logger = logging.getLogger() # 创建logger对象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 创建文件句柄 # sh = logging.StreamHandler() #产生了一个屏幕句柄 # # # 吸星大法 # logger.addHandler(fh) #添加文件句柄 # logger.addHandler(sh) #添加屏幕句柄 # # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message') # 第三版:文件和屏幕都存在的基础上 设置显示格式. # import logging # logger = logging.getLogger() # 创建logger对象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 创建文件句柄 # sh = logging.StreamHandler() #产生了一个屏幕句柄 # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # # # # 吸星大法 # logger.addHandler(fh) #添加文件句柄 # logger.addHandler(sh) #添加屏幕句柄 # sh.setFormatter(formatter) # 设置屏幕格式 # fh.setFormatter(formatter) # 设置文件的格式 (这两个按照需求可以单独设置) # # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message') #第四版 文件和屏幕都存在的基础上 设置显示格式.并且设置日志水平. # import logging # logger = logging.getLogger() # 创建logger对象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 创建文件句柄 # sh = logging.StreamHandler() #产生了一个屏幕句柄 # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # # logger.setLevel(logging.DEBUG) # #如果你对logger对象设置日志等级.那么文件和屏幕都设置了. # #总开关 默认从warning开始,如果想设置分开关:必须要从他更高级:(ERROR,critical)从这来个开始. # # # 吸星大法 # logger.addHandler(fh) #添加文件句柄 # logger.addHandler(sh) #添加屏幕句柄 # sh.setFormatter(formatter) # 设置屏幕格式 # fh.setFormatter(formatter) # 设置文件的格式 (这两个按照需求可以单独设置) # fh.setLevel(logging.DEBUG) # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message')
collections模块
collections 模块给你提供的就是一些特殊的数据类型. namedtuple # 可以定位一个坐标 tu = (1,2) print(tu[0],tu[1]) from collections import namedtuple point = namedtuple('Point',['x','y']) p = point(10,30) # p = (x=10,y=30) print(p.x) print(p.y) print(p[0]) print(p[1]) deque 双端队列 from collections import deque q = deque(['a','b','c','d','e']) print(q) q.append(666) #添加最右边 q.append(777) q.appendleft(111) #从最左边添加 q.appendleft(222) q.pop() # 从右边删除 q.popleft() # 从左边删除 q.popleft() print(q) queue队列 原则:先进先出.fifo 栈: 先进后出.
OrderedDict 按照键的添加值得顺序进行排列 dic = {} dic['name'] = 'alex' dic['age'] = '1000' dic['sex'] = '男' print(dic) from collections import OrderedDict # od = OrderedDict() # od['name'] = 'alex' # od['age'] = '1000' # od['sex'] = '男' # print(od) 装逼版: d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) from collections import OrderedDict od1 = OrderedDict([('a', 1), ('c', 3), ('b', 2),]) print(od1) l1 = [11,22,33,44,55,77,88,99,90] dic = {} for i in l1: if i > 66: if 'key1' not in dic: dic['key1'] = [] dic['key1'].append(i) else: if 'key2' not in dic: dic['key2'] = [] dic['key2'].append(i) print(dic)
##defaultDict(可以被调用的) 给这个字典的所有的键配一个默认的值
from collections import defaultdict l1 = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) my_dict['key1'] my_dict['key2'] print(my_dict) my_dict = defaultdict(list) for value in l1: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) dic1 = {} #---> dic1={1:5,2:5,3:5.....20:5}
格外一个题 ------------------------------------------- for i in range(1,21): dic1[i] = 5 print(dic1) dic1 = {x:5 for x in range(1,21)} dic1 = dict.fromkeys(range(1,21),5)
------------------------------------------------- Counter 自动计数
dic1 = defaultdict(lambda :5) for i in range(1,21): dic1[i] print(dic1) from collections import Counter c = Counter('abcdeabcdabcabafkjdslajlkfd') print(c) 自动计算 a 有多少个 b有多少个 c 有多少个
random模块
#随机的
import random print(random.random()) # 0~1 之间的小数 print(random.uniform(1,3)) # 1~3小数 print(random.randint(1,5)) # 1<=x<=5顾头也顾尾 print(random.randrange(1,10,2)) # 1<=x<10 的奇数 顾首不顾尾 print(random.choice({1,'23',2,3})) # 任选一个 常用 print(random.choice('fdsjafdsfgdsagfdsa')) # 任选一个 常用 random.sample([1,1,1,1,1,6,7,8,9,10],2) # #列表元素任意2个组合 item = [i for i in range(1,14)] random.shuffle(item) # 打乱顺序 print(item)
时间模块 time模块
① 时间戳:测试执行效率 , 通常来说,时间戳表示的是从 1970年1月1日 00:00:00开始按秒计算的偏移量.
我们运行 "type(time.time())" ,返回的是float类型
print(time.time()) #当前的时间戳
print(time.sleep(2)) 停滞2秒 *
② 格式化时间: strftime() *
表示时间,供人类看的
print(time.strftime('%Y-%m-%d %H:%M:%S')) #打印当前的年月日时间
print(time.strftime('%Y - %m - %d %H:%M:%S'),type(time.strftime('%Y - %m - %d %H:%M:%S'))) #打印当前的时间,并判断是什么类型
ret = time.strftime('%Y{}%m{}%d{} %H:%M:%S').format('年','月',';日) #打印出来的是带年月日三个字的时间段
%y 两位数的年份表示(00-99) %Y 四位数的年份表示(000 - 9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数 (00 - 59) %S 秒(00 - 59) %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %j 年内的一天(001-366) %p 本地A.M.或P.M.的等价福 %U 一年中的星期数 (00 -53) 星期天为星期的开始 %w 星期(0 -6),星期天为星期的开始 %W 一年中的星期数(00 -53 ) 星期一为星期的开始 %x 本地相应的日期表示 %X 本地相应的时间表示 %z 当前时区的名称 %% %号本身 python中时间日期格式化符号:
③结构化时间(时间戳与字符串时间中间介质) localtime()
元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
索引(index) | 属性(Attribute) | 值(Values) |
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1- 12 |
2 | tm_mday(日) | 1-31 |
3 | tm_hour(时) | 0 -23 |
4 | tm_min (分) | 0-59 |
5 | tm_sec (秒) | 0-60 |
6 | tm_wday(weekday) | 0-6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1- 366 |
8 | tm_isdst(是否是夏令时) |
默认为0 |
ret = time.localtime() #得到结构化时间
print(ret)
print(time.gmtime()) #伦敦时区的结构化时间
##导入时间模块 import time ##时间戳 time.time() ##时间字符串 >>>time.strftime("%Y-%m-%d %X") '2017-07-24 13:54:37' >>>time.strftime("%Y-%m-%d %H-%M-%S") '2017-07-24 13-55-04' #时间元组:localtime将一个时间戳转换为当前时区的struct_time time.localtime() time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=13, tm_min=59, tm_sec=37, tm_wday=0, tm_yday=205, tm_isdst=0)
小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
几种格式之间的转换
##格式化时间 ---> 结构化时间 ft = time.strftime('%Y/%m/%d %H:%M:%S') st = time.strptime(ft,'%Y/%m/%d %H:%H:%S') print(st) ##结构化 ---> 时间戳 t = time.mktime(st) print(t) ##时间戳 ---> 结构化时间 t =time.time() st = time.localtime(t) print(st) ##结构化时间 --->格式化时间 ft = time.strftime('%Y/%m%d %H:%M:%S',st) print(ft)
##结构化时间 ---> %a %b %d %H:%M:%S %Y串 #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串 >>>time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>>time.asctime() 'Mon Jul 24 15:18:33 2017' #时间戳 --> %a %d %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017' t = time.time() ft = time.ctime(t) print(ft) st = time.localtime() ft = time.asctime(st) print(ft)
os模块
os模块是与操作系统交互的一个接口
#当前执行这个python文件的工作目录相关的工作路径 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') #和文件夹相关 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('文件夹') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('文件夹') 生成单级目录;相当于shell中mkdir dirname os.rmdir('文件夹') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 # 和文件相关 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('文件名') 获取文件/目录信息 # 和操作系统差异相关 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' # 和执行系统命令相关 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 #path系列,和路径相关 os.path.abspath(文件名) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
个别例子:↓
# path系列,和路径相关
# p1 = os.path.abspath('04 os 模块.py') # 获取本文件的绝对路径 *
# print(os.path.split(os.path.abspath('04 os 模块.py'))) # 将path分割成目录和文件名二元组返回 *
# print(os.path.split('E:\sylar\python_workspace\day27')) # 将path分割成目录和文件名二元组返回
# print(os.path.dirname(os.path.abspath('04 os 模块.py'))) #返回工作目录
# print(os.path.basename(os.path.abspath('04 os 模块.py'))) # 通过绝对路径返回当前的文件名
# print(os.path.exists('E:\sylar\python_workspace\day27'))
# print(os.path.exists('E:\sylar\python_workspace\day28'))
print(os.path.join('E:\sylar\python_workspace', '\day28', '\day29')) # * 拼接路径
# print(os.path.getsize('E:\sylar\python_workspace\day27\04 os 模块.py'))
注意:os.stat('path/filename')获取文件/目录信息的结构说明
stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
sys 模块
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
re 模块下的常用方法
import re ret = re.findall('a','eva egon yuan') ##返回所有满足匹配条件的结果,放在列表里 print(ret) #结果 :['a','a'] ret = re.search('a','eva egon yuan').group() print(ret) ##结果: 'a' ##函数会在字符串内查找模式匹配,只找到第一个匹配然后返回一个包含匹配信息的对象,该对##象可以通过 group()方法得到匹配的字符串,如果字符串没有匹配,则返回None. ret = re.match('a','abc').group() ##match默认前面会有一个 ^ print(ret) ##同search ,不过尽在字符串开始处进行匹配 结果:'''a''' ret = re.split('[ab]','abcd') #先按'a' 分割得到 ' ' 和'bcd',在对' '和'bcd'分别按 'b'分割 print(ret) ## [' ', ' ','cd'] ret = re.sub('d','H','eva3egon4yuan4',1) ##将数字替换成'H',参数1表示只替换1个 print(ret) ##evaHegon4yuan4 ret = re.subn('d','H','eva3egon4yuan4') #将数字替换成'H' ,返回元组(替换的结果,替换了多少次) print(ret) ##('evaHegonHyuanH', 3) obj = re.compile('d{3}') ##将正则表达式编译称为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) ##结果:123 import re ret = re.finditer('d','ds3sd1321a') #finditer 返回一个存放匹配结果的迭代器 print(ret) ##<callable_iterator object at 0x10195f940> print(next(ret).group()) ##查看第一个结果 print(next(ret).group()) ##查看第二个结果 print([i.group() for i in ret ])) ##查看剩余的左右结果
# 模块 ****
# 什么是模块?
# py文件
# c语言编译之后的文件
# 写好的代码集合 直接调用它的功能
# import time
# time.sleep()
# 为什么要有模块?
# 内存空间是有限的,存放在硬盘里,当你需要的时候加载到我的内存
# 把丰富的功能封装在一个文件里,等用的时候直接导入内存就可以使用
# 有哪些种类的模块?
# 内置模块
# 扩展模块
# django
# 安装 : pip3 install 模块名
# 自定义模块
# 登录
# 写日志
# 分模块: 功能独立防止代码过长
findall 和 分组的问题 import re # ret = re.findall('d+(?:.d+)?','1.2345+4.3') # ?:写在一个分组的最开始,表示在findall方法中取消这个分组的优先级 # 1.2345 4.3 # .2345 .3 # print(ret) # ret= re.search('d+(.d+)?','1.2345+4.3') # print(ret.group()) # ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # print(ret) # search # ret = re.match('d+', 'hello,alex3714') # print(ret) # 'aa|bb'.split('|') # split中如果带有分组,会在分割的同时保留被分割内容中带分组的部分 # ret = re.split('(dd)','alex83wusir38egon20') # print(ret) # ret = re.sub('d+','sb','alex83wusir38egon20',2) # print(ret) # ret = re.subn('d+','sb','alex83wusir38egon20') # print(ret) # 节省时间 # obj = re.compile('d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 # print(obj) # ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 # print(ret.group()) # ret = obj.search('abc444eeee') #正则表达式对象调用search,参数为待匹配的字符串 # print(ret.group()) # finditer # 迭代功能的 # findall # 节省空间的 # ret = re.finditer('d+','12aas14jsk38947cjhxj83') # print(ret) # for i in ret: # print(i.group()) # 基础查找 findall(分组优先显示) search match # 替换分割 split(分组保留) sub subn # 代码优化 compile finditer # 分组命名 # html标签语言 # html是一种代码 # 对于浏览器来说 浏览器和代码之间有一种约定 # 写在一个标识符之内的代码 可以有一种独立的格式 # 标识符 # <h1>sgjkagjgdjkf</h1> # 给分组起名字 (?P<tag>正则表达式),使用分组的名字(?P=tag) # ret = re.search('<(?P<tag>w+?)>w+</(?P=tag)>',"<b>hello</b>") # print(ret.group()) # print(ret.group('tag')) # 根据分组的索引使用分组 1,1是分组的索引值 # ret = re.search(r'<(w+?)>w+</1>',"<b>hello</b>") # print(ret.group()) # print(ret.group(1)) # ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>") # ret.group(1) # ret = re.finditer(r'<(w+?)>w+</1>',"<b>hesakdfkhfkllo</b>") # for i in ret: # print(i.group(1)) # print(i.group())