模块2

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())
原文地址:https://www.cnblogs.com/liuafan/p/9287143.html