• python之初识模块(day5)


    一、双层装饰器  

    装饰器
    
    @装饰器函数名
    def func():
           pass 
    
    1、将func当作参数传递给装饰器函数,并执行
    2、将装饰器函数的返回值重新赋值给func函数
    重点:
    1、装饰器解释时从下往上按顺序解释

    2、执行时从上往下按顺序执行
    #!/bin/bin/env python
    # -*-coding:utf-8 -*-
    
    # 装饰器解释时从下往上
    # 执行时从上往下执行
    
    # 定义一个全局变量,用来接收用户登录信息
    USER_INFO = {'is_login': False}
    
    
    def check_admin(func):
        """
        检查是否有用户登录
        :param func: 引用当前装饰器的函数,并执行
        :return:返回引用当前装饰器的函数执行后的值
        """
        def inner(*args, **kwargs):
            if USER_INFO.get('is_login', None):
                ret = func(*args, **kwargs)
                return ret
            else:
                print("请先登录")
        return inner
    
    
    def check_permission(func):
        """
        检查权限是否为管理员,如果是则执行func函数,否则不执行
        :param func:引用当前装饰器的函数,并执行
        :return:返回引用当前装饰器的函数执行后的值
        """
        def inner(*args, **kwargs):
            if USER_INFO['roles'] == '1':
                ret = func(*args, **kwargs)
                return ret
            else:
                print("you 没有权限")
        return inner
    
    
    def login():
        user = input("username:")
        roles = input("username roles:")
        USER_INFO['is_login'] = True
        USER_INFO['user'] = user
        USER_INFO['roles'] = roles
        print(USER_INFO)
        return USER_INFO
    
    
    @check_permission
    @check_admin
    def admin_menu():
        """
        管理员的菜单,禁止普通用户查看此菜单
        :return:None
        """
        print("33[33mMyadmin user33[0m")
    
    
    @check_admin
    def user_menu():
        """
        普通用户的菜单,任何用户都可以查看
        :return:
        """
        print("33[31mMyCommon user33[0m")
    
    
    def main():
        """
        定义一个主函数,用来调用其它函数,实现功能
        :return:None
        """
        while True:
            print("""
            1、login
            2、admin_menu
            3、user_menu
            q、 退出
            """)
            select = input("select a number:")
            if select == '1':
                login()
            elif select == '2':
                admin_menu()
            elif select == '3':
                user_menu()
            elif select == 'q' or select == 'quit':
                break
    
    main()
    双层装饰器 Code

    二、字符串格式化之%s

    Python的字符串格式化有两种方式: 百分号方式、format方式

     1 # 字符串格式化
     2 #    %[(name)][flags][width].[precision] typecode
     3 # (name)      可选,用于选择指定的key
     4 # flags          可选,可供选择的值有:
     5 #       +       右对齐;正数前加正好,负数前加负号;
     6 #       -        左对齐;正数前无符号,负数前加负号;
     7 #       空格    右对齐;正数前加空格,负数前加负号;
     8 #       0        右对齐;正数前无符号,负数前加负号;用0填充空白处
     9 # width         可选,占有宽度
    10 # .precision   可选,小数点后保留的位数
    11 # typecode    必选
    12 #         s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
    13 #         r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
    14 #         c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
    15 #         o,将整数转换成 八  进制表示,并将其格式化到指定位置
    16 #         x,将整数转换成十六进制表示,并将其格式化到指定位置
    17 #         d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
    18 #         e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
    19 #         E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
    20 #         f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
    21 #         F,同上
    22 #         g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
    23 #         G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
    24 #         %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
    25 # 
    # 注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
     常用格式化:
    1 tp1 = "i am %s" % "rain"                       # i am rain
    2 tp1 = "i am %s age %d " % ("rain", 21)         # i am rain age 21
    3 tp1 = "i am %(name)s ,age %(age)d" % {'name': "rain", 'age': 22}        # i am rain ,age 22
    4 tp1 = "percent %.3f" % 99.8888                 # percent 99.889
    5 tp1 = "i am %(pp).2f" % {'pp': 12.34567}       # i am 12.35
    6 tp1 = "i am %.2f %%" % 12.3456                # i am 12.35 %
    7 
    8 print(tp1)

    三、字符串格式化之.format

     1 [[fill]align][sign][#][0][width][,][.precision][type]
     2 fill          【可选】空白处填充的字符
     3 
     4 align         【可选】对齐方式(需配合width使用)
     5                 <,内容左对齐
     6                 >,内容右对齐(默认)
     7                 =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
     8                 ^,内容居中
     9  
    10 sign          【可选】有无符号数字
    11                 +,正号加正,负号加负;
    12                  -,正号不变,负号加负;
    13                 空格 ,正号空格,负号加负;
    14 
    15 #             【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
    16 ,            【可选】为数字添加分隔符,如:1,000,000
    17 width         【可选】格式化位所占宽度
    18 .precision    【可选】小数位保留精度
    19 type          【可选】格式化类型
    20     传入” 字符串类型 “的参数
    21         s,格式化字符串类型数据
    22         空白,未指定类型,则默认是None,同s
    23     传入“ 整数类型 ”的参数
    24         b,将10进制整数自动转换成2进制表示然后格式化
    25         c,将10进制整数自动转换为其对应的unicode字符
    26         d,十进制整数
    27         o,将10进制整数自动转换成8进制表示然后格式化;
    28         x,将10进制整数自动转换成16进制表示然后格式化(小写x)
    29         X,将10进制整数自动转换成16进制表示然后格式化(大写X)
    30     传入“ 浮点型或小数类型 ”的参数
    31         e, 转换为科学计数法(小写e)表示,然后格式化;
    32         E, 转换为科学计数法(大写E)表示,然后格式化;
    33         f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
    34         F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
    35         g, 自动在e和f中切换
    36         G, 自动在E和F中切换
    37         %,显示百分比(默认显示小数点后6位)
     常用格式化:
     1 tp1 = "i am {},age {}, {}".format("rain", 21, 'sunny')
     2 tp1 = "i am {}, age {}, {}".format(*['rain', 22, 'ray'])
     3 tp1 = "i am {0}, age {1}, really {0}".format(*["rain", 22])
     4 tp1 = "i am {0} ,age {1} ,really {0}".format('rain', 21)
     5 tp1 = "i am {name}, age {age},really {name}".format(name='sunny', age=21)
     6 tp1 = "i am {name}, age {age} ,really {name}".format(**{'name':'sunny','age':22})
     7 tp1 = "i am {0[0]} , age {0[1]} , {0[0]} , {0[2]}".format(['rain', 21, 'sunny'])
     8 tp1 = "i am {:s}, age {:d} , money {:f}".format("rain", 18, 12.3456)
     9 tp1 = "i am {name:s}, age {age:d}".format(**{'name': 'sunny', 'age': 22})
    10 tp1 = "numbers: {0:b},{0:o},{0:d},{0:x},{0:%}".format(15)
    11 tp1 = "numbers: {num:b},{num:o},{num:d},{num:x},{num:%}".format(num=16)
    print打印结果
     1 # i am rain,age 21, sunny
     2 # i am rain, age 22, ray
     3 # i am rain, age 22, really rain
     4 # i am rain ,age 21 ,really rain
     5 # i am sunny, age 21,really sunny
     6 # i am sunny, age 22 ,really sunny
     7 # i am rain , age 21 , rain , sunny
     8 # i am rain, age 18 , money 12.345600
     9 # i am sunny, age 22
    10 # numbers: 1111,17,15,f,1500.000000%
    11 # numbers: 10000,20,16,10,1600.000000%

    四、生成器迭代器

     1 def func():
     2     print("start")
     3     yield 1
     4     print("22222")
     5     yield 2
     6     print("33333")
     7     yield 3
     8 
     9 ret = func()
    10 for i in ret:
    11     print(i)
    12 
    13 
    14 #######打印结果########
    15         start
    16         1
    17         22222
    18         2
    19         33333
    20         3
    21 ######################

    生成器

    1、生成器(关键字,yeild)

    一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;

    def func():
        print("start")
        yield 1
        print("22222")
        yield 2
        print("33333")
        yield 3
    
    ret = func()
    for i in ret:
        print(i)
    
    
    #######打印结果########
            start
            1
            22222
            2
            33333
            3
    ######################
     1 另一种方法提取生成器数据方法
     2 >>> temp = func()
     3 >>> temp.__next__()
     4 1
     5 >>> temp.__next__()
     6 2
     7 >>> temp.__next__()
     8 3
     9 >>> temp.__next__()
    10 4 11 >>> temp.__next__() 12 Traceback (most recent call last): 13 File "<stdin>", line 1, in <module> 14 StopIteration

    2、迭代器

      特点:

    1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
    2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
    3. 访问到一半时不能往回退
    4. 便于循环比较大的数据集合,节省内存 
    1 a = iter([1, 2, 3, 4, 5])
    2 print(a)
    3 print(a.__next__())
    4 print(a.__next__())
    5 print(a.__next__())
    6 print(a.__next__())
    7 print(a.__next__())
    8 print(a.__next__())
    print打印结果 
     1 <list_iterator object at 0x0000000000A2C5F8>
     2 1
     3 2
     4 3
     5 4
     6 5
    
     8 #报错信息
     9 Traceback (most recent call last):
    10 File "E:/PyCharm4.5.2/PyCharm 文件/day5/字符串格式化.py", line 152, in <module>
    11     print(a.__next__())
    12 StopIteration

    3、实例

    a、利用生成器自定义range

    1
    2
    3
    4
    5
    6
    7
    8
    def nrange(num):
        temp = -1
        while True:
            temp = temp + 1
            if temp >= num:
                return
            else:
                yield temp

    b、利用迭代器访问range

    1 ret=nrange(5)
    2 for i in ret:
    3   print(i)
    #######打印结果########

      0
      1
      2
      3
      4

     ####################

     五、模块

    1、模块简介:

      模块就是通过定义函数,实现某个功能,将这些功能性方法(函数)组合在一起,然后可以让其它程序直接调用该功能,提升代码的可重复性。

      类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成

    (函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

       如:os 是系统相关的模块;file是文件操作相关的模块

    2、模块的种类:

    1、自定义模块

    2、第三方模块

    3、内置模块

      

    1)自定义模块()

      1、模块文件要和代码文件在同一目录下

      2、如果导入的模块不在同一个目录下,但是又需要导入,需要在导入模块的目录下创建__init__.py  

          3、sys.path添加目录

               如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
               通过os模块可以获取各种目录

      

      

    2)第三方模块

    导入第三方模块  

    # 导入自定义的模块test
    import test
    # 直接导入prettytable模块
    import prettytable
    # 从prettytable模块中导入PrettyTable
    from prettytable import PrettyTable
    # 导入一个模块,并重新定义一个别名
    from prettytable import PrettyTable as pretab

    安装第三方模块 

    1)使用pip安装()

    注意:

    有时候直接用PIP无法安装,可以使用以下方法尝试

    2)直接源码安装(需要先下载安装的模块)

    需要编译环境:yum install python-devel gcc
    下载源码包:wget http://xxxxxxxxxxx.tar
    解压:tar -xvf xxx.tar
    进入:cd xxx
    编译:python setup.py build
    安装:python setup.py install
    

    安装还有其它方法,请自行寻找 

    3)内置模块

    一、os模块 提供系统级别的操作

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
    os.curdir  返回当前目录: ('.')
    os.pardir  获取当前目录的父目录字符串名:('..')
    os.makedirs('dirname1/dirname2')    可生成多层递归目录
    os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()  删除一个文件
    os.rename("oldname","newname")  重命名文件/目录
    os.stat('path/filename')  获取文件/目录信息
    os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep    输出用于分割文件路径的字符串
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")  运行shell命令,直接显示
    os.environ  获取系统环境变量
    os.path.abspath(path)  返回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所指向的文件或者目录的最后修改时间

    二、sys模块 用于提供对解释器相关的操作

    sys.argv   命令行参数List,第一个元素是程序本身路径
    sys.modules 返回系统导入的模块字段,key是模块名,value是模块
    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.version        获取Python解释程序的版本信息
    sys.maxint         最大的Int值
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    sys.stdout.write('please:')
    val = sys.stdin.readline()[:-1]
    sys.modules.keys() 返回所有已经导入的模块名
    sys.modules.values() 返回所有已经导入的模块
    sys.exc_info()     获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息
    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.hexversion     获取Python解释程序的版本值,16进制格式如:0x020403F0
    sys.version        获取Python解释程序的
    sys.api_version    解释器的C的API版本
    sys.version_info
    ‘final’表示最终,也有’candidate’表示候选,serial表示版本级别,是否有后继的发行
    sys.displayhook(value)      如果value非空,这个函数会把他输出到sys.stdout,并且将他保存进__builtin__._.指在python的交互式解释器里,’_’ 代表上次你输入得到的结果,hook是钩子的意思,将上次的结果钩过来
    sys.getdefaultencoding()    返回当前你所用的默认的字符编码格式
    sys.getfilesystemencoding() 返回将Unicode文件名转换成系统文件名的编码的名字
    sys.setdefaultencoding(name)用来设置当前默认的字符编码,如果name和任何一个可用的编码都不匹配,抛出 LookupError,这个函数只会被site模块的sitecustomize使用,一旦别site模块使用了,他会从sys模块移除
    sys.builtin_module_names    Python解释器导入的模块列表
    sys.executable              Python解释程序路径
    sys.getwindowsversion()     获取Windows的版本
    sys.copyright      记录python版权相关的东西
    sys.byteorder      本地字节规则的指示器,big-endian平台的值是’big’,little-endian平台的值是’little’
    sys.exc_clear()    用来清除当前线程所出现的当前的或最近的错误信息
    sys.exec_prefix    返回平台独立的python文件安装的位置
    sys.stderr         错误输出
    sys.stdin          标准输入
    sys.stdout         标准输出
    sys.platform       返回操作系统平台名称
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.maxunicode     最大的Unicode值
    sys.maxint         最大的Int值
    sys.version        获取Python解释程序的版本信息
    sys.hexversion     获取Python解释程序的版本值,16进制格式如:0x020403F0

    三、time模块  

    时间相关的操作,时间有三种表示方式:

    • 时间戳               1970年1月1日之后的秒,即:time.time()
    • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
    • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
    print(time.clock()) #返回处理器时间,3.3开始已废弃
    print(time.process_time()) #返回处理器时间,3.3开始已废弃
    print(time.time()) #返回当前系统时间戳
    print(time.ctime()) #输出Tue Jan 26 18:23:48 2016 ,当前系统时间
    print(time.ctime(time.time()-86640)) #将时间戳转为字符串格式
    print(time.gmtime(time.time()-86640)) #将时间戳转换成struct_time格式
    print(time.localtime(time.time()-86640)) #将时间戳转换成struct_time格式,但返回 的本地时间
    print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
    #time.sleep(4) #sleep
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
    print(time.strptime("2016-01-28","%Y-%m-%d") ) #将字符串格式转换成struct_time格式

    四、datetime模块  

    print(datetime.date.today()) #输出格式 2016-01-26
    print(datetime.date.fromtimestamp(time.time()-864400) ) #2016-01-16 将时间戳转成日期格式
    current_time = datetime.datetime.now() #
    print(current_time) #输出2016-01-26 19:04:30.335935
    print(current_time.timetuple()) #返回struct_time格式
      
    #datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
    print(current_time.replace(2014,9,12)) #输出2014-09-12 19:06:24.074900,返回当前时间,但指定的值将被替换
      
    str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") #将字符串转换成日期格式
    new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天
    new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
    new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
    new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
    print(new_date)

     五、logging模块  用于便捷记录日志且线程安全的模块

    1)初识logging模块 

    1 #导入日志模块
    2 import logging
    3 #简单级别日志输出
    4 logging.debug('[debug 日志]')
    5 logging.info('[info 日志]')
    6 logging.warning('[warning 日志]')
    7 logging.error('[error 日志]')
    8 logging.critical('[critical 日志]')

    输出

    ###########输出结果############
    1 WARNING:root:[warning 日志]
    2 ERROR:root:[error 日志]
    3 CRITICAL:root:[critical 日志]

     默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志。

    这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

    默认的日志格式为:

      日志级别:Logger名称:用户输出消息。

    2)灵活配置日志级别,日志格式,输出位置为文件中

    def main():
    
        logging.basicConfig(filename='log.log',
                            format='%(asctime)s %(name)s %(module)s %(funcName)s [line:%(lineno)d] %(levelname)s: '
                                   '%(message)s',
                            datefmt='%Y-%b-%d %H:%M:%S',
                            filemode='a'
                            )
    
        logging.debug("debug message")
        logging.info("info message")
        logging.warning("warning message")
        logging.error("error message")
        logging.critical("critical message")

    调用main()函数执行:

    ####################################log.log文件中显示#####################################
    2016-Jun-07 16:39:25 root sys 模块 main [line:78] WARNING: warning message 2016-Jun-07 16:39:25 root sys 模块 main [line:79] ERROR: error message 2016-Jun-07 16:39:25 root sys 模块 main [line:80] CRITICAL: critical message 2016-Jun-07 16:39:25 rain sys 模块 <module> [line:105] ERROR: logger error message 2016-Jun-07 16:39:25 rain sys 模块 <module> [line:107] CRITICAL: logger critical message

    以上信息详解

    在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
    filename:   用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    
    filemode:   文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    
    format:     指定handler使用的日志显示格式。
    
    datefmt:    指定日期时间格式。(datefmt='%a, %d %b %Y %H:%M:%S',%p)
    
    level:      设置rootlogger(后边会讲解具体概念)的日志级别
    
    stream:     用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。
    
          若同时列出了filename和stream两个参数,则stream参数会被忽略。
    
    format参数中可能用到的格式化串:
    %(name)s             Logger的名字
    %(levelno)s          数字形式的日志级别
    %(levelname)s     文本形式的日志级别
    %(pathname)s     调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s        调用日志输出函数的模块的文件名
    %(module)s          调用日志输出函数的模块名
    %(funcName)s     调用日志输出函数的函数名
    %(lineno)d           调用日志输出函数的语句所在的代码行
    %(created)f          当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d    输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s                 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d                  线程ID。可能没有
    %(threadName)s         线程名。可能没有
    %(process)d               进程ID。可能没有
    %(message)s             用户输出的消息

     如果想屏幕与文件同时都输出,需要继续学习啦!!!!!!

    3)Logger,Handler,Formatter,Filter的概念

    logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler)
    设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数,
    另外还有一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)

    logging库提供了多个组件:Logger、Handler、Filter、Formatter。 Logger 对象提供应用程序可直接使用的接口, Handler 发送日志到适当的目的地, Filter 提供了过滤日志信息的方法, Formatter 指定日志显示格式。
    # 创建一个logger
    logger = logging.getLogger()
    
    # 创建一个带用户名的logger
    logger1 = logging.getLogger('rain')
    
    # 设置一个日志级别
    logger.setLevel(logging.INFO)
    logger1.setLevel(logging.WARNING)
    
    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler('log.log')
    
    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    
    # 定义handler的输出格式formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    
    # 给logger添加handler
    # logger.addFilter(filter)
    logger.addHandler(fh)
    logger.addHandler(ch)
    
    # 给logger1添加handler
    # logger1.addFilter(filter)
    logger1.addHandler(fh)
    logger1.addHandler(ch)
    
    # 给logger添加日志
    logger.info('logger info message')
    logger.debug('logger debug message')
    logger.error('logger error message')
    logger.warning('logger warning message')
    logger.critical('logger critical message')
    
    logger1.info('logger1 info message')
    logger1.debug('logger debug message')
    logger1.error('logger error message')
    logger1.warning('logger warning message')
    logger1.critical('logger critical message')

    输出结果:

    #########################################屏幕输出#####################################################
    
    "D:Program Filespython3.5python3.5python3.exe" "E:/PyCharm4.5.2/PyCharm 文件/day5/sys 模块.py"
    2016-06-07 17:03:28,706 - root - INFO - logger info message
    2016-06-07 17:03:28,707 - root - ERROR - logger error message
    2016-06-07 17:03:28,707 - root - WARNING - logger warning message
    2016-06-07 17:03:28,707 - root - CRITICAL - logger critical message
    07 Jun 2016 17:03:28 - rain - ERROR - logger error message
    2016-06-07 17:03:28,708 - rain - ERROR - logger error message
    2016-06-07 17:03:28,708 - rain - ERROR - logger error message
    07 Jun 2016 17:03:28 - rain - WARNING - logger warning message
    2016-06-07 17:03:28,708 - rain - WARNING - logger warning message
    2016-06-07 17:03:28,708 - rain - WARNING - logger warning message
    07 Jun 2016 17:03:28 - rain - CRITICAL - logger critical message
    2016-06-07 17:03:28,709 - rain - CRITICAL - logger critical message
    2016-06-07 17:03:28,709 - rain - CRITICAL - logger critical message
    ##############################################文件输出结果###################################################

     

    对于等级:

    CRITICAL = 50
    FATAL = CRITICAL
    ERROR = 40
    WARNING = 30
    WARN = WARNING
    INFO = 20
    DEBUG = 10
    NOTSET = 0
    

    未完待续!!!

  • 相关阅读:
    金额数字每隔3位用逗号区分
    tomcat结合shiro无文件webshell的技术研究以及检测方法
    python使用p12个人证书发送S/MIME加密,签名邮件
    CVE-2020-9484 tomcat session反序列化漏洞分析与复现
    Apache CommonCollection Gadget几种特殊的玩法
    weblogic t3协议回显穿透nat思路
    weblogic T3/iiop 回显分析
    ysoserial gadget之DNSURL gadget分析及实战利用
    CVE-2020-2555 weblogic 反序列化gadget 复现
    通达OA最新RCE漏洞分析
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/5562123.html
Copyright © 2020-2023  润新知