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("\033[33mMyadmin user\033[0m") @check_admin def user_menu(): """ 普通用户的菜单,任何用户都可以查看 :return: """ print("\033[31mMyCommon user\033[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()
二、字符串格式化之%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、迭代器
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
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下为"\t\n",Linux下为"\n" 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 Files\python3.5\python3.5\python3.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
未完待续!!!