zoukankan      html  css  js  c++  java
  • 模块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())
  • 相关阅读:
    EXISTS 的使用
    bind()和 unbind()绑定解绑事件的使用
    前端代码
    LIKE CONCAT 连用
    客服工作台
    杂录
    vue
    咋乱杂乱的一些总结
    kotlin 很杂很杂
    group by 和 order by 的区别 + 理解过程
  • 原文地址:https://www.cnblogs.com/liuafan/p/9287143.html
Copyright © 2011-2022 走看看