Python学习(三)

一、正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式有两部分参数,一个是匹配规则pattern,另一个是待匹配的数据源,data_source,用正则表达式时需要导入模块re,import re

import re
m = re.match('abc','abcdef') # 其中abc为pattern,abcdef为data_source,re.match(pattern,data_source)方法,
                              # 从data_source的左边开头进行匹配,若匹配上返回一个对象并且停止匹配,即只能匹配一次,匹配不上返回None
print(m)
if m:
    print(m.group()) # obj.group()方法,查看匹配到的内容

<_sre.SRE_Match object; span=(0, 3), match='abc'>
abc

但以上的方法pattern写的固定,只能匹配abc不够灵活,且只能匹配一次

import re
m1 = re.findall('[0-9]{0,10}','146567abc576def') # 其中[0-9]{0,10}为pattern,[0-9]代表匹配的为0-9的数字,
                                                  # {0,10}代表前面定义的类型可以为相同的0-10个进行匹配,可以写一个数字代表确定的个数进行匹配
                                                  # 146567abc576def为data_source,re.match(pattern,data_source)方法,
                                                  # 把data_source的符合匹配规则的子字符全部匹配出来返回一个列表,
                                                  # {0,10}存在0,则返回的列表会出现空的,一般是从1开始,例如{1,10}
m2 = re.findall('[0-9]{1,10}','146567abc576def')
m3 = re.findall('[a-zA-Z]{1,10}','146567abc576def') # [a-zA-Z]代表匹配为所有字母,大小写均可
m4 = re.findall('.*','146567abc576def') # 其中.代表可以匹配换行符以外的所有字符,*代表0到多个,功能类似{0,10}
m5 = re.findall('.+','146567abc576def') # 其中+代表1到多个,功能类似于{1,10}
m6 = re.search('\d+','146567abc576def') # re.search()方法,从data_source的左边开头进行匹配,直到找到一个符合的结果然后结束,
                                          # 或者找遍data_source都没有发现结束,其中\d代表匹配任意数字,类似[0-9],
                                          # \D代表匹配任意非数字,\s代表匹配任意空白字符,\S代表匹配任意非空字符,
                                          # \w匹配字母数字,\W匹配非字母数字
m7 = re.search('^\d+','146567abc576def') # 其中^代表从data_source的第一个字符开始就要求符合匹配规则,否则找不到NoneType,
                                           # $代表从data_source的最后一个字符要符合匹配规则
m8 = re.sub('\d+','-','146567abc576def') # re.sub(pattern,str,data_source,count= )方法,从data_source的左边开始,
                                           # 把匹配到的子字符串替换为设定的str,count=num可以指定替换的个数,默认全部替换
if m1 or m2 or m3 or m4 or m5 or m6 or m7 or m8:
    # print(m.group())  # re.findall没有obj.group()方法,直接使用print(obj)查看匹配到的内容
    print(m1)
    print(m2)
    print(m3)
    print(m4)
    print(m5)
    print(m6.group()) # 查看re.search()中匹配到的子字符串
    print(m7.group())
    print(m8)

['146567', '', '', '', '576', '', '', '', '']
['146567', '576']
['abc', 'def']
['146567abc576def', '']
['146567abc576def']
146567
146567
-abc-def

对于较大的文件,可以先定义出pattern,然后再进行后面的匹配,避免每一次匹配都要编译一次pattern

import re
p = re.compile("^[0-9]+")  # 先定义出匹配规则pattern
m1 = p.match("145sdfea")
print(m1.group())

IP_pattern = re.compile('([0-9]{1,3}\.){3}\d{1,9}') # 定义IP地址的匹配规则
IP_pattern1 = re.compile(r'([0-9]{1,3}.){3}\d{1,9}') # pattern外面加上r,代表pattern的一些字符不转义,
                                                     # 例如,.就代表一个.字符,而不再代表任意字符
IP_string = 'my ip is 192.168.1.56 you know'
IP_result = IP_pattern.search(IP_string)
IP_result1 = IP_pattern1.search(IP_string)
print(IP_result.group())
print(IP_result1.group())

m2 = re.split('[0-9]','alngo8song9aoeia4asong5sefj') # re.split(pattern,data_source)方法,将匹配到的子字符串当做分割点,
# 把data_source分割为一个一个字符串,返回一个列表,列表中字符串不包括匹配到的子字符串
print(m2)

145
192.168.1.56
192.168.1.56
['alngo', 'song', 'aoeia', 'asong', 'sefj']

二、模块调用

模块,就是一堆代码,实现了某个功能的代码集合,对于一个复杂功能可能需要多个函数才能完成(函数可以写在不同的.py文件中),这些n个.py文件组成的代码集合就是模块。创建一个模块的文件夹,不是用dictionary而是python package,他们的区别就是python package中有一个空的__init__.py文件,有这个文件模块才能被调用,由于模块要能被不同使用者调用,所以写模块时要用到解耦的思想,即使不同的功能程序之间的关联度降低。模块之间相互导入时文件寻找范围是文件所在同一文件夹下的内容,所以同级文件可以直接导入 import xxx,导入下级目录文件可以按目录寻找导入from dirname import xxx,但需要导入上级目录的文件时要添加上级文件的路径才行

 1  # 同级之间调用
 2  -- src
 3      |-- mod1.py
 4      |-- test1.py
 5  # 程序test1.py中导入模块mod1, 则直接使用
 6  import mod1
 7 #
 8  from mod1 import *
 9  
10 # 子级之间调用
11 -- src
12     |-- mod1.py
13     |-- lib
14     |    |-- mod2.py
15     |-- test1.py
16 # 程序test1.py中导入模块mod2,使用
17 from lib.mod2 import *
18 #
19 import lib.mod2
20  
21 # 上级模块调用
22 -- src
23     |-- mod1.py
24     |-- lib
25     |    |-- mod2.py
26     |-- sub
27     |    |-- test2.py
28 # 想要实现test2.py调用mod1.py和mod2.py,做法是我们先跳到src目录下面
29 import sys
30 sys.path.append("..")  # 需要添加上级模块路径,.. 表示当前目录的上级目录,想要调用更上级的模块,则需要添加对应模块的绝对路径,
31                        # sys.path.append('../'),导入os模块import os,
32                        # os.path.abspath(__file__)方法找到文件的绝对路径,
33                        # os.path.dirname()方法,去掉最后一级文件或目录,利用os.path.dirname(os.path.dirname(os.path.abspath(__file__)))方法,逐层嵌套直至绝对路径的最后一级目录为需要导入模块的目录,可以把这个路径结果赋予一个变量,然后添加路径
34 import mod1 
35 import lib.mod2

三、模块介绍

time & datatime模块,提供的函数和方法可以获取与时间相关的操作,例如:获取系统时间,统计程序执行时间,WEB程序的响应时间等。

import time
print(time.time()) # time.time(),返回从1970年1月1日0点0分以来的秒数,在编程中用来做时间戳
print(time.clock()) # time.clock(),第一次调用的时候,返回的是程序运行到这行代码的实际时间
for i in range(3):
    print(i)
    time.sleep(1) # time.sleep(num),挂起当前的进程,参数num表示进程挂起的时间,单位是秒
print(time.ctime(1234567.89)) # 将一个时间戳(默认为当前时间)转换成一个时间字符串,时间戳单位为秒
print(time.clock()) # time.clock(),第二次及其之后的调用,返回的是自第一次调用后,到再次调用的时间间隔
print(time.gmtime()) # time.gmtime(),传入时间参数,单位为秒,以UTC格式返回struct_time对象时间,默认参数为time.time()
print(time.localtime()) # time.localtime(),传入时间参数,单位为秒,返回struct_time对象本地时间或者系统时间,默认参数为time.time()
print(time.mktime(time.gmtime())) # time.mktime(),传入struct_time格式时间,返回对应秒数时间
print(time.strptime(time.ctime(time.time()))) # time.strptime(),按指定格式解析一个表示时间的字符串,返回struct_time对象时间
print(time.strftime('%Y-%m-%d'))   # time.strftime(),将日期格式化符号转化为时间字符串,
                                    # python中时间日期格式化符号:
                                    # %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 当前时区的名称

1498483996.0492818
0.0
0
1
2
Thu Jan 15 14:56:07 1970
3.001460992756618
time.struct_time(tm_year=2017, tm_mon=6, tm_mday=26, tm_hour=13, tm_min=33, tm_sec=19, tm_wday=0, tm_yday=177, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=6, tm_mday=26, tm_hour=21, tm_min=33, tm_sec=19, tm_wday=0, tm_yday=177, tm_isdst=0)
1498455199.0
time.struct_time(tm_year=2017, tm_mon=6, tm_mday=26, tm_hour=21, tm_min=33, tm_sec=19, tm_wday=0, tm_yday=177, tm_isdst=-1)
2017-06-26

datetime模块包含三个类,date、time、datetime,date类表示一个日期,日期由年、月、日组成,time类表示时间,由时、分、秒以及微秒组成,datetime是date与time的结合体,包括date与time的所有信息。

 1 from datetime import date
 2 print(date.max,date.min) # 所能表示的最大、最小日期
 3 print(date.resolution) # 表示日期的最小单位,这里是天
 4 print(date.today()) # 返回一个当前的本地日期
 5 print(date.fromtimestamp(1234567.89)) # 给一个时间戳参数,返回一个日期
 6 test_date = date(2015,8,23)
 7 print(test_date) # 给出年、月、日参数,返回一个日期的格式
 8 print(test_date.replace(2016,5,day=9)) # obj.replace(year,mouth,day),给出年月日的参数,代替原来的时间
 9 print(test_date.timetuple()) # obj.timetuple(),返回日期对应的time.struct_time对象
10 print(test_date.toordinal()) # obj.toordinal(),返回日期对应的Gregorian Calendar日期
11 print(test_date.weekday()) # obj.weekday(),返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推
12 print(test_date.isoweekday()) # obj.isoweekday(),返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推
13 print(test_date.isocalendar()) # obj.isocalendar(),返回格式如(year,month,day)的元组
14 print(test_date.isoformat()) # obj.isoformat(),返回格式如'YYYY-MM-DD'的字符串
15 print(test_date.strftime('%a-%b-%c-%H'))   # obj.strftime(日期格式),将原本日期重新定义格式后返回,日期格式
16                                             # %a    星期的简写,如星期三为Web
17                                             # %A    星期的全写,如星期三为Wednesday
18                                             # %b    月份的简写,如4月份为Apr
19                                             # %B    月份的全写,如4月份为April
20                                             # %c    日期时间的字符串表示。(如: 04/07/10 10:43:39)
21                                             # %d    日在这个月中的天数(是这个月的第几天)
22                                             # %f    微秒(范围[0,999999])
23                                             # %H    小时(24小时制,[0, 23])
24                                             # %I    小时(12小时制,[0, 11])
25                                             # %j    日在年中的天数 [001,366](是当年的第几天)
26                                             # %m    月份([01,12])
27                                             # %M    分钟([00,59])
28                                             # %p    AM或者PM
29                                             # %S    秒(范围为[00,61])
30                                             # %U    周在当年的周数当年的第几周),星期天作为周的第一天
31                                             # %w    今天在这周的天数,范围为[0, 6],6表示星期天
32                                             # %W    周在当年的周数(是当年的第几周),星期一作为周的第一天
33                                             # %x    日期字符串(如:04/07/10)
34                                             # %X    时间字符串(如:10:43:39)
35                                             # %y    2个数字表示的年份
36                                             # %Y    4个数字表示的年份
37                                             # %z    与utc时间的间隔 (如果是本地时间,返回空字符串)
38                                             # %Z    时区名称(如果是本地时间,返回空字符串)
39                                             # %%    %% => %
40 # date还对一些操作进行了重载,允许对日期进行如下一些操作:日期加上一个间隔timedelta,返回一个新的日期对象,
41 # 日期隔去间隔,返回一个新的日期对象,两个日期相减,返回一个时间间隔对象,两个日期进行比较,
42 # 对日期进行操作时,要防止日期超出它所能表示的范围。
43 now = date.today()
44 tomorrow = now.replace(day = 11)
45 delta = tomorrow - now
46 print('now:', now, ' tomorrow:', tomorrow)
47 print('timedelta:', delta)
48 print(now + delta)
49 print(tomorrow > now)

9999-12-31 0001-01-01
1 day, 0:00:00
2017-06-28
1970-01-15
2015-08-23
2016-05-09
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=235, tm_isdst=-1)
735833
6
7
(2015, 34, 7)
2015-08-23
Sun-Aug-Sun Aug 23 00:00:00 2015-00
now: 2017-06-28 tomorrow: 2017-06-11
timedelta: -17 days, 0:00:00
2017-06-11
False

from datetime import time
print(time.max,time.min) # 所能表示的最大、最小时间
print(time.resolution) # 表示时间的最小单位,这里是微秒
tm = time(7, 17, 10)  # 给出时间参数,返回一个时间格式的类
print(type(tm))
print('tm:', tm)
print('hour: %d, minute: %d, second: %d, microsecond: %d'
      % (tm.hour, tm.minute, tm.second, tm.microsecond)) # obj.hour,obj.minute,obj.second,obj.microsecond,
                                                         # 分别返回时间格式的小时、分钟、秒、微妙
tm1 = tm.replace(hour = 8) # 给出新的时间参数,返回新的时间代替原来的时间
print('tm1:', tm1)
print('isoformat():', tm.isoformat()) # 返回时间格式的字符串
print(type(tm.isoformat()))
# 像date一样,time也可以对两个time对象进行比较,或者相减返回一个时间间隔对象

23:59:59.999999 00:00:00
0:00:00.000001
<class 'datetime.time'>
tm: 07:17:10
hour: 7, minute: 17, second: 10, microsecond: 0
tm1: 08:17:10
isoformat(): 07:17:10
<class 'str'>

from datetime import datetime
print(datetime.max,datetime.min) # datetime所能表示的最小值与最大值
print(datetime.resolution) # datetime所能表示的最小单位
print(datetime.today(),type(datetime.today())) # 返回本地的时间对象
print(datetime.now(),type(datetime.now())) # 返回一个表示当前本地时间的datetime对象
print(datetime.utcnow(),type(datetime.utcnow())) # 返回一个当前utc时间的datetime对象
print(datetime.fromtimestamp(123456.78)) # 给一个时间戳参数,返回一个datetime对象
print(datetime.utcfromtimestamp(123456.78)) # 给一个时间戳参数,返回一个utc格式datetime对象
dt = datetime.fromtimestamp(12345678.9)
print(dt,type(dt))
print(dt.day)
print(dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond) # obj.year,obj.month,obj.day,obj.hour,
                                                                          # obj.mimute,obj.second,obj.microsecond,
                                                                          # 分别得到datetime对象的年、月、日、小时、分、秒、微秒
print(dt.date()) # obj.date(),得到datetime对象的日期
print(dt.time()) # obj.time(),得到datetime对象的时间
print(dt.replace(year=1990,month=6,day=10,microsecond=2333)) # obj.replace(year,month,day,hour,minute,second,microsecond),
                                                             # 传入年、月、日等参数,取代原来datetime对象中的值得到新的datetime对象,原来的datetime对象不变
print(dt.timetuple()) # obj.timetuple(),返回datetime对象的struct_time格式时间
print(dt.weekday()) # obj.weekday(),返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推
print(dt.isoweekday()) # obj.isoweekday(),返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推
print(dt.isocalendar()) # obj.isocalendar(),返回格式如(year,month,day)的元组
print(dt.isoformat(),type(dt.isoformat())) # obj.isoformat(),返回格式如'YYYY-MM-DD'的字符串
print(dt.ctime(),type(dt.ctime())) # obj.ctime(),返回一个日期时间格式的字符串
print(dt.strftime('%a %b')) # obj.strftime(日期格式),将原本日期重新定义格式后返回,日期格式
                            # %a    星期的简写,如星期三为Web
                            # %A    星期的全写,如星期三为Wednesday
                            # %b    月份的简写,如4月份为Apr
                            # %B    月份的全写,如4月份为April
                            # %c    日期时间的字符串表示。(如: 04/07/10 10:43:39)
                            # %d    日在这个月中的天数(是这个月的第几天)
                            # %f    微秒(范围[0,999999])
                            # %H    小时(24小时制,[0, 23])
                            # %I    小时(12小时制,[0, 11])
                            # %j    日在年中的天数 [001,366](是当年的第几天)
                            # %m    月份([01,12])
                            # %M    分钟([00,59])
                            # %p    AM或者PM
                            # %S    秒(范围为[00,61])
                            # %U    周在当年的周数当年的第几周),星期天作为周的第一天
                            # %w    今天在这周的天数,范围为[0, 6],6表示星期天
                            # %W    周在当年的周数(是当年的第几周),星期一作为周的第一天
                            # %x    日期字符串(如:04/07/10)
                            # %X    时间字符串(如:10:43:39)
                            # %y    2个数字表示的年份
                            # %Y    4个数字表示的年份
                            # %z    与utc时间的间隔 (如果是本地时间,返回空字符串)
                            # %Z    时区名称(如果是本地时间,返回空字符串)
                            # %%    %% => %

9999-12-31 23:59:59.999999 0001-01-01 00:00:00
0:00:00.000001
2017-06-29 15:03:04.261054 <class 'datetime.datetime'>
2017-06-29 15:03:04.261053 <class 'datetime.datetime'>
2017-06-29 07:03:04.261053 <class 'datetime.datetime'>
1970-01-02 18:17:36.780000
1970-01-02 10:17:36.780000
1970-05-24 05:21:18.900000 <class 'datetime.datetime'>
24
1970 5 24 5 21 18 900000
1970-05-24
05:21:18.900000
1990-06-10 05:21:18.002333
time.struct_time(tm_year=1970, tm_mon=5, tm_mday=24, tm_hour=5, tm_min=21, tm_sec=18, tm_wday=6, tm_yday=144, tm_isdst=-1)
6
7
(1970, 21, 7)
1970-05-24T05:21:18.900000 <class 'str'>
Sun May 24 05:21:18 1970 <class 'str'>
Sun May

random模块,用于生成随机数,一下是random模块中最常用的几个函数

import random
print(random.random()) # random.random(),随机生成一个(0,1)之间的浮点数
print(random.uniform(3,5)) # random.uniform(a,b),随机生成一个(a,b)之间的浮点数
print(random.randint(6,9)) # random.randint(a,b),随机生成一个(a,b)之间的整数
print(random.randrange(7,20,3)) # random.randrange(a,b,c),随机在一个从a开始按c递增到b的集合中选取一个
print(random.choice('Arelax')) # random.choice(sequence),随机从一个序列中选取一个,列表、元组、字符串都属于序列
test_list = ['zhu','shanwei','is','handsome']
random.shuffle(test_list) # random.shuffle(list),将列表中的元素打乱顺序
print(test_list)
new_list = random.sample(test_list,3) # random.sample(sequence,k),从序列中随机选取三个元素,组成一个新列表返回,
                                      # 原来序列不会被改变,列表、元组、字符串都属于序列
print(new_list)

0.30439801060116023
4.031051910060102
9
19
a
['handsome', 'zhu', 'is', 'shanwei']
['handsome', 'is', 'shanwei']

os & os.path模块,提供对操作系统进行调用的接口,不受平台限制,可以处理文件和目录这些我们日常手动需要做的操作

import os
import os.path
print(os.name) # 输出字符串指示当前使用的平台,win-->nt,linux-->posix
print(os.getcwd()) # 获取当前程序文件的所在路径
# os.chdir(path)  改变工作路径
print(os.curdir) # 得到当前目录字符串
print(os.pardir) # 得到当前目录的父目录字符串
# os.makedirs('dirname1/dirname2/dirname2') 生成多级文件夹,若已有文件夹则报错
# os.mkdir('dirname') 生成单极文件夹
# os.removedirs('dirname1/dirname2')  检查最后一级文件夹是否为空,若为空则删除文件夹,并返回到上一级,若文件夹仍为空继续删除,以此类推
# os.rmdir('dirname') 删除单极空文件夹,若目录不为空则无法删除,报错
print(os.listdir('day1')) # os.listdir(path),列出所给路径下的所有文件夹和文件,包括隐藏文件,并以列表方式给出
# os.remove(path) 删除所给路径的文件
# os.rename('olddirname','newdirname')  重命名文件/文件夹
print(os.stat('day1')) # os.stat(path/filename),获取目录/文件的信息
# os.symlink(src,dst) 把源地址src与目标地址dst创建一个软连接,没有返回值
dir_list = []
folder_list = []
file_list = []
for dir1,folder1,file1 in os.walk('day1'): # os.walk(path) 返回包含(dir,folder,file)三种信息的generator,其中file为文件名、dir为file的目录、folder为dir下的目录,可循环读出
    dir_list.append(dir1)
    folder_list.append(folder1)
    file_list.append(file1)
print(dir_list)
print(folder_list)
print(file_list)
# os.system('dir') os.system(command),给命令参数可直接运行
a= os.popen('dir').read()  # os.popen(command),把命令的运行结果生成一个对象,可以直接读出,也可以赋给一个变量然后读出
b = os.popen('dir')
print(a)
print(b.read())
print(os.environ) # os.environ,获取系统环境变量
print(os.path.abspath('exercise.py')) # os.path.abspath(dirname/filename),返回文件规范化的绝对路径
c = os.path.split('E:\python exercise\exercise.py') # os.path.split(path),将路径分割成目录和文件名两部分,以元组返回
print(c)
print(os.path.dirname('E:\python exercise\exercise.py')) # os.path.dirname(path),返回path的目录,其实就是os.path.split(path)的第一个元素
print(os.path.basename('E:\python exercise\exercise.py')) # os.path.basename(path),返回path最后的文件名
# os.path.join(path1,path2[, ...]]) 将多个路径组合后返回
# os.path.commonprefix(list) 列表中元素为路径,返回list中所有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
print(os.path.normpath('E:\/python exercise//exercise.py')) # os.path.normpath(path),规范化路径
print(os.path.splitdrive('E:\python exercise\exercise.py')) # os.path.splitdrive(path),拆分驱动器名和路径为两部分,以元组返回
print(os.path.splitext('E:\python exercise\exercise.py')) # os.path.splitext(path),分离文件名与扩展名为两部分,以元组返回
print(os.path.getsize('E:\python exercise\exercise.py')) # os.path.getsize(path),返回path的大小(字节)
print(os.path.getatime('E:\python exercise\exercise.py')) # os.path.getatime(path),返回path所指向的文件或者目录的最后存取时间
print(os.path.getmtime('E:\python exercise\exercise.py')) # os.path.getmtime(path),返回path所指向的文件或者目录的最后修改时间
print(os.path.getctime('E:\python exercise\exercise.py')) # os.path.getctime(path),返回path所指向的文件或者目录的创建时间

nt
E:\python exercise
.
..
['guess_number.py', 'guess_number1.py', 'information.py', 'work1', 'work2']
os.stat_result(st_mode=16895, st_ino=281474976712310, st_dev=428346, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1496668362, st_mtime=1496668362, st_ctime=1496663193)
['day1', 'day1\\work1', 'day1\\work2']
[['work1', 'work2'], [], []]
[['guess_number.py', 'guess_number1.py', 'information.py'], ['local.log', 'readme.txt', 'user_password.py', '流程图.vsdx'], ['menu.py', '流程图.vsdx']]


驱动器 E 中的卷是 文档
卷的序列号是 0006-893A

E:\python exercise 的目录

2017/06/30 11:53 <DIR> .
2017/06/30 11:53 <DIR> ..
2017/06/30 11:54 <DIR> .idea
2017/05/10 15:26 30,966 1.jpg
2017/05/05 15:47 167,844,260 123.avi
2017/05/14 15:44 59 123.txt
2017/01/04 20:35 41,126 2.jpg
2017/01/04 19:39 11,434 3.jpg
2017/06/13 10:12 60 456.txt
2017/01/04 21:23 30,785 5.jpg
2017/01/04 21:24 18,451 6.jpg
2017/04/06 19:21 7,923,035 car_vidio.flv
2017/06/05 21:12 <DIR> classify
2017/06/05 21:12 <DIR> day1
2017/06/05 21:12 <DIR> day2
2017/06/05 21:12 <DIR> day3
2017/06/30 11:53 3,957 exercise.py
2017/01/13 20:43 7,496,789 hog.txt
2017/06/25 21:47 12,849 Matplotlib.py
2017/06/19 00:57 19,061 numpy&pandas.py
2017/06/27 22:03 <DIR> save_model
2017/06/27 22:02 9,889 Sklearn.py
2017/06/19 00:58 65 test.csv
2017/06/28 14:49 897 test.py
16 个文件 183,443,683 字节
8 个目录 50,338,816,000 可用字节

 

驱动器 E 中的卷是 文档
卷的序列号是 0006-893A

E:\python exercise 的目录

2017/06/30 11:53 <DIR> .
2017/06/30 11:53 <DIR> ..
2017/06/30 11:54 <DIR> .idea
2017/05/10 15:26 30,966 1.jpg
2017/05/05 15:47 167,844,260 123.avi
2017/05/14 15:44 59 123.txt
2017/01/04 20:35 41,126 2.jpg
2017/01/04 19:39 11,434 3.jpg
2017/06/13 10:12 60 456.txt
2017/01/04 21:23 30,785 5.jpg
2017/01/04 21:24 18,451 6.jpg
2017/04/06 19:21 7,923,035 car_vidio.flv
2017/06/05 21:12 <DIR> classify
2017/06/05 21:12 <DIR> day1
2017/06/05 21:12 <DIR> day2
2017/06/05 21:12 <DIR> day3
2017/06/30 11:53 3,957 exercise.py
2017/01/13 20:43 7,496,789 hog.txt
2017/06/25 21:47 12,849 Matplotlib.py
2017/06/19 00:57 19,061 numpy&pandas.py
2017/06/27 22:03 <DIR> save_model
2017/06/27 22:02 9,889 Sklearn.py
2017/06/19 00:58 65 test.csv
2017/06/28 14:49 897 test.py
16 个文件 183,443,683 字节
8 个目录 50,338,816,000 可用字节

 

environ({'USERDOMAIN_ROAMINGPROFILE': 'ZSW', 'HOMEPATH': '\\Users\\Arelax', 'SYSTEMDRIVE': 'C:', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'PROGRAMFILES': 'C:\\Program Files', 'LOGONSERVER': '\\\\ZSW', 'TMP': 'C:\\Users\\Arelax\\AppData\\Local\\Temp', 'USERPROFILE': 'C:\\Users\\Arelax', 'SESSIONNAME': 'Console', 'TEMP': 'C:\\Users\\Arelax\\AppData\\Local\\Temp', 'COMPUTERNAME': 'ZSW', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel', 'PROCESSOR_REVISION': '3c03', 'NUMBER_OF_PROCESSORS': '4', 'SYSTEMROOT': 'C:\\Windows', 'LOCALAPPDATA': 'C:\\Users\\Arelax\\AppData\\Local', 'HOMEDRIVE': 'C:', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'USERNAME': 'Arelax', 'PROGRAMW6432': 'C:\\Program Files', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'PROGRAMDATA': 'C:\\ProgramData', 'USERDOMAIN': 'ZSW', 'WINDIR': 'C:\\Windows', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'PATH': 'D:\\Anaconda3\\Library\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;D:\\Anaconda3;D:\\Anaconda3\\Scripts;D:\\Anaconda3\\Library\\bin;D:\\Anaconda3\\MinGW\\bin;D:\\Anaconda3\\MinGW\\x86_64-w64-mingw32\\lib', 'APPDATA': 'C:\\Users\\Arelax\\AppData\\Roaming', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'OS': 'Windows_NT', 'PYTHONIOENCODING': 'UTF-8', 'FP_NO_HOST_CHECK': 'NO', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'PYTHONPATH': 'E:\\python exercise', 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'PYTHONUNBUFFERED': '1', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '1'})


E:\python exercise\exercise.py
('E:\\python exercise', 'exercise.py')
E:\python exercise
exercise.py
E:\python exercise\exercise.py
('E:', '\\python exercise\\exercise.py')
('E:\\python exercise\\exercise', '.py')
3957
1498794827.3380208
1498794827.4012773
1496663186.4562693

sys模块,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互

import sys
print(sys.path) # 返回模块的搜索路径
print(sys.maxsize) # 获取64位系统正整数的最大值
print(sys.version) # 获取python解释程序的版本信息
print(sys.platform) # 返回操作系统平台
sys.stdout.write('123\n') # 打印输出,功能等同与print()
test_in = sys.stdin.readline()[:-1] # 从键盘接受输入,功能等同与input()
print(test_in)
# print("sys.argv[0]---------",sys.argv[0])
# print("sys.argv[1]---------",sys.argv[1])
# print("sys.argv[2]---------",sys.argv[2])
if len(sys.argv) < 2:  # sys.argv,返回本文件的路径
    print('No action specified.')
    sys.exit()
if sys.argv[1].startswith('--'):  # obj.starswith(str),表示判断obj是否以str开头,如果是返回True
   option = sys.argv[1][2:]  # sys.argv[1][2:],表示所接受的第二个参数从第三个字符开始往后的内容
   # fetch sys.argv[1] but without the first two characters
   if option == 'version':
      print('Version 1.2')
# sys.argv[],用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,当由CMD进入命令窗口,
# 并进入到本文件所在目录(例如,进入E盘的命令为 E:,然后进入到E盘的文件夹目录命令为 cd dirname),
# 输入python exercise.py --version help,则会执行该程序,并且argv接收所给命令参数,
# 由于从argv[0]开始接收命令参数,所以第一个参数必需为文件名,然后argv[1]接收第二个参数,以此类推
# sys.exit(n) 退出程序命令,正常退出为exit(0)

['E:\\python exercise', 'E:\\python exercise', 'D:\\Anaconda3\\python35.zip', 'D:\\Anaconda3\\DLLs', 'D:\\Anaconda3\\lib', 'D:\\Anaconda3', 'D:\\Anaconda3\\lib\\site-packages', 'D:\\Anaconda3\\lib\\site-packages\\Sphinx-1.3.5-py3.5.egg', 'D:\\Anaconda3\\lib\\site-packages\\win32', 'D:\\Anaconda3\\lib\\site-packages\\win32\\lib', 'D:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'D:\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.5.egg']
9223372036854775807
3.5.3 |Anaconda 2.5.0 (64-bit)| (default, May 15 2017, 10:43:23) [MSC v.1900 64 bit (AMD64)]
win32
123
输入:456
456

shutil模块,对文件、文件夹、压缩包的处理模块

import shutil

file1 = open('hog.txt','r')
with open('hog1.txt','w') as file2:
    shutil.copyfileobj(file1,file2) # shutil.copyfileobj(filesrc,filedst,length)方法,
                                # 将一个对象的内容拷贝到另一个文件,参数为文件对象,
                                # 即打开后的文件变量名,可指定拷贝的文件长度
file1.close()
shutil.copyfile('hog.txt','hog2.txt') # shutil.copyfile(src,dst)方法,将一个文件的内容拷贝到另一个文件中,
                                        # 参数为文件名,目标文件可以不存在(不存在自动创建)# shutil.copymode('f1.log', 'f2.log')  仅拷贝权限,内容、组、用户均不变,目标文件必须存在
# shutil.copystat('f1.log', 'f2.log')  仅拷贝状态的信息,包括:mode bits, atime, mtime, flags,目标文件必须存在
shutil.copy('hog.txt','hog3.txt') # 拷贝文件内容和权限,目标文件可以不存在
shutil.copy2('hog.txt','hog4.txt') # 拷贝文件内容和状态信息,目标文件可以不存在
shutil.copytree('classify','classify2',ignore=shutil.ignore_patterns('*.py','car*')) # 把一个文件夹中的内容拷贝到另外一个文件夹,
                                                                                        # 参数为文件夹名,目标文件夹不能存在,目标文件夹的父级目录要有可写权限,
                                                                                        # ignore的意思是排除 ,例子中是以.py结尾和以car开头的文件不拷贝
shutil.rmtree('classify2') # 删除一个目录
shutil.move('classify','123') # 把源文件夹中的内容移动到目标文件夹中,然后把源文件夹删除,目标文件夹可以不存在,功能相当于重命名
shutil.make_archive('classify','zip','E:\python exercise\classify') # make_archive(base_name, format, root_dir)方法,把文件夹或者文件压缩成压缩包,
                                       # base_name是压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存至指定路径,
                                       # format是压缩包种类,“zip”, “tar”, “bztar”,“gztar”,
                                       # root_dir是要压缩的文件夹路径,即要压缩的对象(默认为压缩当前目录的所以文件)

pickle和json模块,把内存中的数据进行序列化,序列化之后就可以存储到磁盘上,或通过网络传输到别的机器上,有序列化就有反序列化,把内容从序列化对象重新读取到内存的过程称之为反序列化。json只能处理基本数据类型(例如,列表、元组、字典);pickle能处理所有的Python数据类型,json多用于各个语言之间的网络传输;pickle多用于Python程序对象的持久化或Python程序之间的网络传输

import pickle
import json

d = {"a":1,"b":2}

f1 = open("pickle_test1.txt","wb") # 用pickle进行序列化,序列化为二进制形式,保存的文件需要二进制形式打开
pickle_d = pickle.dumps(d) # 将一个字典序列化
print(pickle_d)
print(type(pickle_d))
f1.write(pickle_d)  # 将序列化的内容写入文件
f1.close()

f2 = open("pickle_test2.txt","wb")
pickle.dump(d,f2)  # 可以把序列化和写入文件的操作合并在一起
f2.close()

f3 = open("pickle_test1.txt","rb") # 用二进制写入的文件,读的时候也为二进制
dd = f3.read()
pickle_d2 = pickle.loads(dd) # 或者pickle.loads(f3.read()),读出文件中的内容然后反序列化
print(pickle_d2)
print(type(pickle_d2))
f3.close()

f4 = open("pickle_test2.txt","rb")
pickle_d3 = pickle.load(f4) # 把读文件和序列化合并到一起
print(pickle_d3)
f4.close()

# json提供和pickle同样的功能,json序列化成的是字符串,不是二进制
f5 = open("pickle_test3.txt","w")
f6 = open("pickle_test4.txt","w")
json_d1 = json.dumps(d)
print(json_d1)
print(type(json_d1))
f5.write(json_d1)
json.dump(d,f6)
f5.close()
f6.close()

f7 = open("pickle_test3.txt","r")
f8 = open("pickle_test4.txt","r")
dd2 = f7.read()
json_d2 = json.loads(dd2)
print(json_d2)
print(type(json_d2))
json_d3 = json.load(f8)
print(json_d3)
print(type(json_d3))
f7.close()
f8.close()

b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02u.'
<class 'bytes'>
{'a': 1, 'b': 2}
<class 'dict'>
{'a': 1, 'b': 2}
{"a": 1, "b": 2}
<class 'str'>
{'a': 1, 'b': 2}
<class 'dict'>
{'a': 1, 'b': 2}
<class 'dict'>

shelve模块,是一个简单的数据存储方案,只有一个函数open(),接收参数是文件名,然后返回一个类似字典的对象

import shelve

file = shelve.open('shelve_data') # 创建一个文件,不需要存在,会自动创建,不需要后缀名
file['baidu'] = 'www.baidu.com' # 以字典的形式传入文件,进行序列化
file['qq'] = 'www.qq.com'
file['360'] = 'www.360.cn'
file.close()       # 保存文件
file1 = shelve.open('shelve_data')
key_value1 = file1.get('qq') # 以字典的键形式,得到对应的值
key_value2 = file1['360']
print(key_value1)
print(key_value2)

www.qq.com
www.360.cn

xml模块,实现不同语言和程序之间进行数据交换的协议,和json类似,但json使用起来更简单,xml通过<>节点来区分数据结构,xml文档的格式如下

<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2023</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2026</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2026</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>
import xml.etree.ElementTree as ET

test_tree = ET.parse('test.xml') # 解析xml文件
test_root = test_tree.getroot()  # 得到xml文件的根节点以及根节点下的元素对象
print(test_root)
print(test_root.tag)  # 得到根节点的名称
for test_child in test_root:   # 循环得到根节点下的子节点
    print(test_child.tag,test_child.attrib)  # 得到子节点的名称和属性
    for i in test_child:  # 循环得到子节点下的子节点
        print('---->',i.tag,i.attrib,i.text) # 得到子节点下的名称、属性和值
for test_node in test_root.iter('year'): # 循环某一节点
    print(test_node.tag,test_node.text)
for node1 in test_root.iter('year'):
    new_year = int(node1.text)+1  # 由于读出来的值为字符串,变为整数形式之后才能修改,加1
    node1.text = str(new_year)  # 把int形式改为str形式更新year节点为新的值
    node1.set('updated','yes') # 为year节点添加设置属性
test_tree.write('new_test.xml') # 把改后的xml保存为新的xml文件,可以不事先存在
for country in test_root.findall('country'):  # 找到所有的country节点
    rank = int(country.find('rank').text)  # 找到country节点下的rank节点的值
    if rank>50:
        test_root.remove(country) # 移除符和条件的country节点
test_tree.write('new_test1.xml')

# 自己创建一个xml文件
new_tree = ET.Element('namelist')  # 设置一个根节点
name1 = ET.SubElement(new_tree,'name1',attrib={'zhu':'shanwei'}) # 创建父节点下的一个子节点,参数为父节点变量名、子节点名称、子节点属性
sex1 = ET.SubElement(name1,'sex1',attrib={'age':'man'}) # 创建子节点下的一个子节点
age1 = ET.SubElement(name1,'age1')
age1.text = str(27)
sex1.text = 'man'
name2 = ET.SubElement(new_tree,'name2',attrib={'feng':'jin'}) # 创建父节点下的另一个子节点,参数为父节点变量名、子节点名称、子节点属性
sex2 = ET.SubElement(name2,'sex2',attrib={'age':'woman'}) # 创建子节点下的一个子节点
age2 = ET.SubElement(name2,'age2')
age2.text = str(25)
sex2.text = 'woman'
new_xml = ET.ElementTree(new_tree) # 生成所创建的文件
new_xml.write('new_xml.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False)
ET.dump(new_xml) # 打印显示出生成的文件内容

<Element 'data' at 0x0000002AD16D02C8>
data
country {'name': 'Liechtenstein'}
----> rank {'updated': 'yes'} 2
----> year {} 2023
----> gdppc {} 141100
----> neighbor {'name': 'Austria', 'direction': 'E'} None
----> neighbor {'name': 'Switzerland', 'direction': 'W'} None
country {'name': 'Singapore'}
----> rank {'updated': 'yes'} 5
----> year {} 2026
----> gdppc {} 59900
----> neighbor {'name': 'Malaysia', 'direction': 'N'} None
country {'name': 'Panama'}
----> rank {'updated': 'yes'} 69
----> year {} 2026
----> gdppc {} 13600
----> neighbor {'name': 'Costa Rica', 'direction': 'W'} None
----> neighbor {'name': 'Colombia', 'direction': 'E'} None
year 2023
year 2026
year 2026
<namelist><name1 zhu="shanwei"><sex1 age="man">man</sex1><age1>27</age1></name1><name2 feng="jin"><sex2 age="woman">woman</sex2><age2>25</age2></name2></namelist>

configparser模块,用于生产和修改常见的配置文档,配置文件的格式与windows ini文件类似,配置文件(INI文件)由节(section)、键、值组成,可以包含一个或多个节(section),每个节可以有多个参数(键=值),配置文件格式如下,配置文件中用的是冒号,也可以用等号

[book]  
title:ConfigParser模块教程  
time:2012-09-20 22:04:55  
  
[size]  
size:1024  
  
[other]  
blog:csdn.net 
import configparser

config = configparser.ConfigParser()  # 先声明定义一个configparser配置文档对象
config["default"] = {'name':'zhu shanwei',
                     'age':'27',
                     'hobby':'game'} # 定义一个节,和节中的键和值
config['bitbucket.org'] = {} # 定义一个新的节,内容为空
config['bitbucket.org']['User'] = 'hg' # 向节中写入键和值
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com'] # 可以把节赋给一个变量
topsecret['Host Port'] = '50022'  # 向节中写入键和值
topsecret['ForhardX11'] = 'no'
config['default']['ForhardX11'] = 'yes'
with open('example.ini','w') as configfile:
    config.write(configfile) # 保存配置文件

config.read('example.ini') # 读取配置文件,读取之前要先声明一下配置文件对象,即上面的configparser.ConfigParser()
section_list = config.sections()
print(section_list) # 得到配置文件的节名称,返回一个列表
key_list = config.options(section_list[0])
print(key_list) # 得到某个节中的键名称,返回一个列表
value_test = config.get(section_list[0],key_list[0]) # 得到某个节中某一键的值
print(value_test)
key_value = config.items(section_list[1]) # 得到某一个节的键和值,返回一个列表,列表中每一个元素为键和值组成的一个元组
print(key_value)
result_section = config.has_section(section_list[2]) # 判断节是否在配置文件中,若在返回True
print(result_section)
result_key = config.has_option(section_list[2],key_list[0]) # 判断节中是否有某个键,若在返回True
print(result_key)
config.add_section('add_section') # 向配置文件中添加节点
config.set('add_section','sex','man') # 向节点中添加键和值
config.remove_section(section_list[1]) # 删除某一节及节中的内容
config.remove_option(section_list[0],key_list[1]) # 删除节中某一键及其键的内容
with open('example1.ini','w') as configfile:
    config.write(configfile) # 保存配置文件

['default', 'bitbucket.org', 'topsecret.server.com']
['age', 'hobby', 'name', 'forhardx11']
27
[('user', 'hg')]
True
False

hashlib模块,用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib

m = hashlib.md5() # 声明用什么方式加密
m1 = hashlib.md5()
m.update(b'zhu shanwei') # 添加要加密的内容
m1.update(b'zhu shanwei')
print(m.digest())  # 2进制格式hash
print(m.hexdigest())  # 16进制格式hash
print(m1.hexdigest())  # 在同一种加密方式下,相同的内容加密后的结果相同
m.update(b"is handsome")
print(m.hexdigest())  # 根据加密的内容的添加,返回不同的加密内容,加密内容不可被反解

b'*2x\xce\x0f\xbe^\x92\x8e~s7\x801\x97\xac'
2a3278ce0fbe5e928e7e7337803197ac
2a3278ce0fbe5e928e7e7337803197ac
05a1e96bb6473b8009ecaf63452ae2bb

logging模块,程序日志相关模块,通过它可以存储各种格式的日志,提供有debug()、info()、warning()、error()、critical()五种级别的日志,级别依次提高

import logging

logging.basicConfig(format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='logging_example.log',level=logging.INFO) # 把日志写的文件里,文件不需要预先存在,
                                                                         # level的级别设定是把同级别和以上的级别存档,以下级别不存储,
                                                                         # 要设置日志的格式,需要先format定义,以上定义的内容分别为时间、
                                                                         # 文件名、日志程序所在的行数、日志等级、日志信息,datefmt为所定义的时间格式filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
  %(levelno)s: 打印日志级别的数值
  %(levelname)s: 打印日志级别名称
  %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
  %(filename)s: 打印当前执行程序名
  %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
  %(asctime)s: 打印日志的时间
  %(thread)d: 打印线程ID
  %(threadName)s: 打印线程名称
  %(process)d: 打印进程ID
 %(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
   logging.warning("user [Arelax] attempted wrong password more than 3 times") # logging.类型("内容"),可以直接显示出来 logging.critical("the server is down") logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this too')
import logging

# 把日志同时显示在屏幕和写入文件中
logger = logging.getLogger('LOG_TEST') # 定义一个logging对象,参数为自定义的名称
logger.setLevel(logging.WARNING) # 定义全局的日志级别

ch = logging.StreamHandler() # 定义显示屏幕的handle
ch.setLevel(logging.DEBUG) # 定义屏幕显示级别,和全局日志级别比较,取较二者高级别作为日志等级

fh = logging.FileHandler('logging_example1.log') # 定义写入文件的handle,同时定义文件名
fh.setLevel(logging.ERROR) # 定义写入文件级别,和全局日志级别比较,取较二者高级别作为日志等级

formater = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') # 定义日志的格式,其中%(name)s为logging对象自定义的名称

ch.setFormatter(formater) # 将日志格式赋予handle
fh.setFormatter(formater)

logger.addHandler(ch) # 将handle赋予logging的对象,在此定义的是logger
logger.addHandler(fh)

# 以对象logger给出日志的信息
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

2017-07-14 12:36:34,543-LOG_TEST-WARNING-logger warning message
2017-07-14 12:36:34,543-LOG_TEST-ERROR-logger error message
2017-07-14 12:36:34,543-LOG_TEST-CRITICAL-logger critical message

posted on 2017-06-21 12:10  水涵空  阅读(337)  评论(0)    收藏  举报