热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python之初识模块(day5)

一、双层装饰器装饰器装饰器函数名deffunc():pass1、将func当作参数传递给装饰器函数,并执行2、将装饰器函数的返回值重新赋值给func函数重点&

一、双层装饰器  

装饰器@装饰器函数名
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 retelse:print("请先登录")return innerdef check_permission(func):"""检查权限是否为管理员,如果是则执行func函数,否则不执行:param func:引用当前装饰器的函数,并执行:return:返回引用当前装饰器的函数执行后的值"""def inner(*args, **kwargs):if USER_INFO['roles'] == '1':ret = func(*args, **kwargs)return retelse:print("you 没有权限")return innerdef login():user = input("username:")roles = input("username roles:")USER_INFO['is_login'] = TrueUSER_INFO['user'] = userUSER_INFO['roles'] = rolesprint(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、login2、admin_menu3、user_menuq、 退出""")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':breakmain()

双层装饰器 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&#xff0c;整数&#xff1a;将数字转换成其unicode对应的值&#xff0c;10进制范围为 0 <&#61; i <&#61; 1114111&#xff08;py27则只支持0-255&#xff09;&#xff1b;字符&#xff1a;将字符添加到指定位置
15 # o&#xff0c;将整数转换成 八 进制表示&#xff0c;并将其格式化到指定位置
16 # x&#xff0c;将整数转换成十六进制表示&#xff0c;并将其格式化到指定位置
17 # d&#xff0c;将整数、浮点数转换成 十 进制表示&#xff0c;并将其格式化到指定位置
18 # e&#xff0c;将整数、浮点数转换成科学计数法&#xff0c;并将其格式化到指定位置&#xff08;小写e&#xff09;
19 # E&#xff0c;将整数、浮点数转换成科学计数法&#xff0c;并将其格式化到指定位置&#xff08;大写E&#xff09;
20 # f&#xff0c; 将整数、浮点数转换成浮点数表示&#xff0c;并将其格式化到指定位置&#xff08;默认保留小数点后6位&#xff09;
21 # F&#xff0c;同上
22 # g&#xff0c;自动调整将整数、浮点数转换成 浮点型或科学计数法表示&#xff08;超过6位数用科学计数法&#xff09;&#xff0c;并将其格式化到指定位置&#xff08;如果是科学计数则是e&#xff1b;&#xff09;
23 # G&#xff0c;自动调整将整数、浮点数转换成 浮点型或科学计数法表示&#xff08;超过6位数用科学计数法&#xff09;&#xff0c;并将其格式化到指定位置&#xff08;如果是科学计数则是E&#xff1b;&#xff09;
24 # %&#xff0c;当字符串中存在格式化标志时&#xff0c;需要用 %%表示一个百分号
25 #

# 注&#xff1a;Python中百分号格式化是不存在自动将整数转换成二进制表示的方式

常用格式化&#xff1a;

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

常用格式化&#xff1a;

1 tp1 &#61; "i am {},age {}, {}".format("rain", 21, &#39;sunny&#39;)
2 tp1 &#61; "i am {}, age {}, {}".format(*[&#39;rain&#39;, 22, &#39;ray&#39;])
3 tp1 &#61; "i am {0}, age {1}, really {0}".format(*["rain", 22])
4 tp1 &#61; "i am {0} ,age {1} ,really {0}".format(&#39;rain&#39;, 21)
5 tp1 &#61; "i am {name}, age {age},really {name}".format(name&#61;&#39;sunny&#39;, age&#61;21)
6 tp1 &#61; "i am {name}, age {age} ,really {name}".format(**{&#39;name&#39;:&#39;sunny&#39;,&#39;age&#39;:22})
7 tp1 &#61; "i am {0[0]} , age {0[1]} , {0[0]} , {0[2]}".format([&#39;rain&#39;, 21, &#39;sunny&#39;])
8 tp1 &#61; "i am {:s}, age {:d} , money {:f}".format("rain", 18, 12.3456)
9 tp1 &#61; "i am {name:s}, age {age:d}".format(**{&#39;name&#39;: &#39;sunny&#39;, &#39;age&#39;: 22})
10 tp1 &#61; "numbers: {0:b},{0:o},{0:d},{0:x},{0:%}".format(15)
11 tp1 &#61; "numbers: {num:b},{num:o},{num:d},{num:x},{num:%}".format(num&#61;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 &#61; 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、生成器(关键字&#xff0c;yeild)

一个函数调用时返回一个迭代器&#xff0c;那这个函数就叫做生成器&#xff08;generator&#xff09;&#xff1b;如果函数中包含yield语法&#xff0c;那这个函数就会变成生成器&#xff1b;

def func():print("start")yield 1print("22222")yield 2print("33333")yield 3ret &#61; func()
for i in ret:print(i)#######打印结果########
start1222222333333
######################

1 另一种方法提取生成器数据方法
2 >>> temp &#61; 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 "", line 1, in
14 StopIteration

2、迭代器

  特点&#xff1a;

  1. 访问者不需要关心迭代器内部的结构&#xff0c;仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 &#xff0c;只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合&#xff0c;节省内存 

1 a &#61; 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
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
11 print(a.__next__())
12 StopIteration

3、实例

a、利用生成器自定义range

 

1
2
3
4
5
6
7
8
def nrange(num):
    temp &#61; -1
    while True:
        temp &#61; temp &#43; 1
        if temp >&#61; num:
            return
        else:
            yield temp

b、利用迭代器访问range

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

  0
  1
  2
  3
  4

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

 五、模块

1、模块简介&#xff1a;

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

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

&#xff08;函数又可以在不同的.py文件中&#xff09;&#xff0c;n个 .py 文件组成的代码集合就称为模块。

   如&#xff1a;os 是系统相关的模块&#xff1b;file是文件操作相关的模块

2、模块的种类&#xff1a;

1、自定义模块

2、第三方模块

3、内置模块

  

1&#xff09;自定义模块()

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

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

      3、sys.path添加目录

 

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

 

  

  

 

2&#xff09;第三方模块

导入第三方模块  

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

安装第三方模块 

1&#xff09;使用pip安装&#xff08;&#xff09;

注意&#xff1a;

有时候直接用PIP无法安装&#xff0c;可以使用以下方法尝试

2&#xff09;直接源码安装&#xff08;需要先下载安装的模块&#xff09;

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

安装还有其它方法&#xff0c;请自行寻找 

3&#xff09;内置模块

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

os.getcwd() 获取当前工作目录&#xff0c;即当前python脚本工作的目录路径
os.chdir(
"dirname") 改变当前脚本工作目录&#xff1b;相当于shell下cd
os.curdir 返回当前目录: (
&#39;.&#39;)
os.pardir 获取当前目录的父目录字符串名&#xff1a;(
&#39;..&#39;)
os.makedirs(
&#39;dirname1/dirname2&#39;) 可生成多层递归目录
os.removedirs(
&#39;dirname1&#39;) 若目录为空&#xff0c;则删除&#xff0c;并递归到上一级目录&#xff0c;如若也为空&#xff0c;则删除&#xff0c;依此类推
os.mkdir(
&#39;dirname&#39;) 生成单级目录&#xff1b;相当于shell中mkdir dirname
os.rmdir(
&#39;dirname&#39;) 删除单级空目录&#xff0c;若目录不为空则无法删除&#xff0c;报错&#xff1b;相当于shell中rmdir dirname
os.listdir(
&#39;dirname&#39;) 列出指定目录下的所有文件和子目录&#xff0c;包括隐藏文件&#xff0c;并以列表方式打印
os.remove() 删除一个文件
os.rename(
"oldname","newname") 重命名文件/目录
os.stat(
&#39;path/filename&#39;) 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符&#xff0c;win下为
"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符&#xff0c;win下为
"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win
->&#39;nt&#39;; Linux->&#39;posix&#39;
os.system(
"bash command") 运行shell命令&#xff0c;直接显示
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以&#xff0f;或\结尾&#xff0c;那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在&#xff0c;返回True&#xff1b;如果path不存在&#xff0c;返回False
os.path.isabs(path) 如果path是绝对路径&#xff0c;返回True
os.path.isfile(path) 如果path是一个存在的文件&#xff0c;返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录&#xff0c;则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回&#xff0c;第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

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

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

三、time模块  

时间相关的操作&#xff0c;时间有三种表示方式&#xff1a;

  • 时间戳               1970年1月1日之后的秒&#xff0c;即&#xff1a;time.time()
  • 格式化的字符串    2014-11-11 11:11&#xff0c;    即&#xff1a;time.strftime(&#39;%Y-%m-%d&#39;)
  • 结构化时间          元组包含了&#xff1a;年、日、星期等... time.struct_time    即&#xff1a;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 &#61; 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
&#61; datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") #将字符串转换成日期格式
new_date &#61; datetime.datetime.now() &#43; datetime.timedelta(days&#61;10) #比现在加10天
new_date &#61; datetime.datetime.now() &#43; datetime.timedelta(days&#61;-10) #比现在减10天
new_date &#61; datetime.datetime.now() &#43; datetime.timedelta(hours&#61;-10) #比现在减10小时
new_date &#61; datetime.datetime.now() &#43; datetime.timedelta(seconds&#61;120) #比现在&#43;120s
print(new_date)

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

1)初识logging模块 

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

输出

###########输出结果############

1 WARNING:root:[warning 日志]
2 ERROR:root:[error 日志]
3 CRITICAL:root:[critical 日志]

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

这说明默认的日志级别设置为WARNING&#xff08;日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET&#xff09;

默认的日志格式为:

  日志级别&#xff1a;Logger名称&#xff1a;用户输出消息。

2&#xff09;灵活配置日志级别&#xff0c;日志格式&#xff0c;输出位置为文件中

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

调用main()函数执行&#xff1a;

####################################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 模块 [line:105] ERROR: logger error message
2016-Jun-07 16:39:25 rain sys 模块 [line:107] CRITICAL: logger critical message

以上信息详解

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

 如果想屏幕与文件同时都输出&#xff0c;需要继续学习啦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;

3&#xff09;Logger&#xff0c;Handler&#xff0c;Formatter&#xff0c;Filter的概念

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

logging库提供了多个组件&#xff1a;Logger、Handler、Filter、Formatter。Logger 对象提供应用程序可直接使用的接口&#xff0c;
Handler 发送日志到适当的目的地&#xff0c;
Filter 提供了过滤日志信息的方法&#xff0c;
Formatter 指定日志显示格式。

# 创建一个logger
logger &#61; logging.getLogger()# 创建一个带用户名的logger
logger1 &#61; logging.getLogger(&#39;rain&#39;)# 设置一个日志级别
logger.setLevel(logging.INFO)
logger1.setLevel(logging.WARNING)
# 创建一个handler&#xff0c;用于写入日志文件
fh &#61; logging.FileHandler(&#39;log.log&#39;)# 再创建一个handler&#xff0c;用于输出到控制台
ch &#61; logging.StreamHandler()# 定义handler的输出格式formatter
formatter &#61; logging.Formatter(&#39;%(asctime)s - %(name)s - %(levelname)s - %(message)s&#39;)
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(&#39;logger info message&#39;)
logger.debug(
&#39;logger debug message&#39;)
logger.error(
&#39;logger error message&#39;)
logger.warning(
&#39;logger warning message&#39;)
logger.critical(
&#39;logger critical message&#39;)logger1.info(&#39;logger1 info message&#39;)
logger1.debug(
&#39;logger debug message&#39;)
logger1.error(
&#39;logger error message&#39;)
logger1.warning(
&#39;logger warning message&#39;)
logger1.critical(
&#39;logger critical message&#39;)

输出结果:

#########################################屏幕输出#####################################################"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

 

##############################################文件输出结果###################################################

 

对于等级&#xff1a;

CRITICAL &#61; 50
FATAL &#61; CRITICAL
ERROR &#61; 40
WARNING &#61; 30
WARN &#61; WARNING
INFO &#61; 20
DEBUG &#61; 10
NOTSET &#61; 0

 

未完待续&#xff01;&#xff01;&#xff01;

 

转:https://www.cnblogs.com/yxy-linux/p/5562123.html



推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • php支持中文文件名
    2019独角兽企业重金招聘Python工程师标准大家可能遇到过上传中文文件名的文件,或者读取中文目录时不能读取,出现错误的情况这种情况是因为php自动将中文字符转成了utf8 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
author-avatar
万承裕常明
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有