以列表返回全部知足条件的结果python
1 import re 2 print(re.findall('\d','a1b2c2abc123'))#['1', '2', '2', '1', '2', '3']
查找到第一个匹配信息就返回一个包含匹配信息的对象(未找到时返回None),该对象经过group()函数查看结果正则表达式
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.search('\d', str).group()) # 1
从字符串开始位置匹配,其它同search()shell
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.match('\d', str).group() if re.match('\d', str) else '未找到') # 未找到 5 print(re.match('a.+', str).group() if re.match('a', str) else '未找到') # a1b2c2abc123
以正则匹配到的字符切割字符串,返回切割后的字符串列表json
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.split('[123]', str)) # ['a', 'b', 'c', 'abc', '', '', '']
将匹配到的内容替换为指定内容,返回替换后的字符串()bash
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.sub('[123]', 'A', str)) # aAbAcAabcAAA
将匹配到的内容替换为指定内容,返回元祖.第一个值是替换后的字符串,第二个值是替换的次数数据结构
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.subn('[123]', 'A', str)) # ('aAbAcAabcAAA', 6)
将正则表达式编译为字节码对象,可屡次调用app
1 import re 2 3 str = 'a1b2c2abc123' 4 re_obj = re.compile('[123]') 5 print(re_obj.sub('A', str)) # aAbAcAabcAAA 6 print(re_obj.subn('A', str)) # ('aAbAcAabcAAA', 6) 7 print(re_obj.findall(str)) # ['1', '2', '2', '1', '2', '3'] 8 print(re_obj.split(str)) # ['a', 'b', 'c', 'abc', '', '', ''] 9 print(re_obj.match(str)) # None 10 print(re_obj.search(str).group()) # 1
返回一个存放匹配结果的迭代器dom
1 import re 2 3 str = 'a1b2c2abc123' 4 result = re.finditer('\d', str) 5 print(result) # <callable_iterator object at 0x00000000026F80F0> 6 print(next(result).group()) # 1 7 print(next(result).group()) # 2 8 print([g.group() for g in result]) # ['2', '1', '2', '3']
findall会优先把组匹配结果内容返回ide
?: 可取消优先返回组匹配结果函数
1 import re 2 3 print(re.findall('zz([a-y])', 'zze')) # ['e'] 4 print(re.findall('zz(?:[a-y])', 'zze')) # ['zze']
当正则包含组时,切割结果会保留分割内容
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.split('\d', str)) # ['a', 'b', 'c', 'abc', '', '', ''] 5 print(re.split('(\d)', str)) # ['a', '1', 'b', '2', 'c', '2', 'abc', '1', '', '2', '', '3', '']
可经过'?P'给组命名
1 import re 2 3 str = '<title>python learning</title>' 4 result = re.search('<(?P<tag_name>[a-z]+)>(?P<title>.+)</([a-z]+)>', str) 5 print(result.group('title')) # python learning 6 print(result.group('tag_name')) # title 7 print(result.group()) # <title>python learning</title>
1 from collections import namedtuple 2 3 Point = namedtuple('point', ['x', 'y']) 4 point1 = Point(1, 2) 5 point2 = Point(2, 3) 6 print(point1) # point(x=1, y=2) 7 print(point1.x, point1.y) # 1 2 8 print(point2) # point(x=2, y=3) 9 print(point2.x, point2.y) # 2 3
1 from collections import deque 2 3 dq = deque([1, 2]) 4 dq.append('a') # 尾部插入 [1,2,'a'] 5 dq.appendleft('b') # 头部插入 ['b',1,2,'a'] 6 dq.insert(2, 3) # ['b',1,3,2,'a'] 7 print(dq.pop()) # a 从后面取数据 8 print(dq.pop()) # 2 9 print(dq.popleft()) # b 从前面取数据 10 print(dq) # deque([1, 3])
1 # 有序字典 2 from collections import OrderedDict 3 4 od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 5 for k in od: 6 print(k) 7 8 # result: 9 # a 10 # b 11 # c
1 from collections import defaultdict 2 3 d = defaultdict(lambda: 5) # 传入callable参数 4 d['key1'] = 1 5 print(d['key1']) # 1 6 print(d['key']) # 5 不存在时使用默认值
1 from collections import Counter 2 3 c = Counter('abcdeabcdabcaba') 4 print(c) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
一般来讲,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量运行“type(time.time())”,返回的是float类型
如:'1999-12-06'
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 当前时区的名称 %% %号自己
struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 好比2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是不是夏令时) | 默认为0 |
1 import time 2 print(time.time()) # 1535813663.732
1 import time 2 3 print(time.strftime("%Y-%m-%d %X")) # 2018-09-01 22:55:30 4 print(time.strftime("%Y-%m-%d %H-%M-%S")) # 2018-09-01 22-55-30
1 import time 2 3 print( 4 time.localtime()) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=1, tm_hour=22, tm_min=56, tm_sec=31, tm_wday=5, tm_yday=244, tm_isdst=0)
1 import time 2 3 # 时间戳-->结构化时间 localtime() 4 print(time.localtime( 5 1600000000)) # time.struct_time(tm_year=2020, tm_mon=9, tm_mday=13, tm_hour=20, tm_min=26, tm_sec=40, tm_wday=6, tm_yday=257, tm_isdst=0) 6 7 # 结构化时间-->时间戳 mktime() 8 print(time.mktime(time.localtime(1600000000))) # 1600000000.0
1 import time 2 3 # 结构化时间-->字符串时间 4 # time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则显示当前时间 5 print(time.strftime("%Y-%m-%d %X")) # 2018-09-01 23:06:43 6 print(time.strftime("%Y-%m-%d", time.localtime(1600000000))) # 2020-09-13 7 8 # 字符串时间-->结构化时间 9 # time.strptime(时间字符串,字符串对应格式) 10 print(time.strptime("2018-09-01 23:06:43", 11 "%Y-%m-%d %X")) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=1, tm_hour=23, tm_min=6, tm_sec=43, tm_wday=5, tm_yday=244, tm_isdst=-1) 12 print(time.strptime("07/24/2017", 13 "%m/%d/%Y")) # time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
1 import time 2 last_time=time.mktime(time.strptime('1997-05-12 08:30:00','%Y-%m-%d %H:%M:%S')) 3 time_now=time.mktime(time.strptime('2018-09-01 11:00:00','%Y-%m-%d %H:%M:%S')) 4 dif_time=time_now-last_time 5 struct_time = time.localtime(dif_time) 6 print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1, 7 struct_time.tm_mday-1,struct_time.tm_hour, 8 struct_time.tm_min,struct_time.tm_sec))
1 import random 2 3 print(random.random()) # 0.33630703804107664 大于0且小于1之间的小数 4 print(random.uniform(1, 3)) # 2.0639651365332607 大于1小于3的小数
1 import random 2 3 print(random.randint(1,5)) # 2 大于等于1且小于等于5之间的整数 4 print(random.randrange(1,10,2)) # 1 大于等于1且小于10之间的奇数
1 import random 2 3 # 随机选择一个返回 4 print(random.choice([1, '23', [4, 5]])) # 23 5 # 随机选择多个返回,返回的个数为函数的第二个参数 6 print(random.sample([1, '23', [4, 5]], 2)) # ['23', [4, 5]]
1 import random 2 3 item = [1, 2, 3, 4, 5] 4 random.shuffle(item) # 打乱次序 5 print(item) # [4, 2, 5, 3, 1]
1 import random 2 3 def v_code(): 4 code = '' 5 for i in range(5): 6 num = random.randint(0, 9) 7 alf = chr(random.randint(65, 90)) 8 add = random.choice([num, alf]) 9 code = "".join([code, str(add)]) 10 11 return code 12 13 print(v_code())
os模块是与操做系统交互的一个接口
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.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.getcwd() 获取当前工做目录,即当前python脚本工做的目录路径 os.chdir("dirname") 改变当前脚本工做目录;至关于shell下cd 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所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序自己路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操做系统平台名称
序列化:将对象转成字符串
反序列化:将字符串转成对象
用于字符串和python数据类型间进行转换
dumps():序列化,将对象转成字符串
loads():反序列化,将字符串转成对象
1 import json 2 3 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 4 str_dic = json.dumps(dic) # 序列化:将一个字典转换成一个字符串 5 print(type(str_dic), str_dic) # <class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} 6 # 注意,json转换完的字符串类型的字典中的字符串是由""表示的 7 8 dic2 = json.loads(str_dic) # 反序列化:将一个字符串格式的字典转换成一个字典 9 # 注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 10 print(type(dic2), dic2) # <class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 11 12 list_dic = [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] 13 str_dic = json.dumps(list_dic) # 也能够处理嵌套的数据类型 14 print(type(str_dic), str_dic) # <class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] 15 list_dic2 = json.loads(str_dic) 16 print(type(list_dic2), list_dic2) # <class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
1 import json 2 f = open('file','w') 3 json.dump({'国籍':'中国'},f) 4 ret = json.dumps({'国籍':'中国'}) 5 f.write(ret+'\n') 6 json.dump({'国籍':'美国'},f,ensure_ascii=False) 7 ret = json.dumps({'国籍':'美国'},ensure_ascii=False) 8 f.write(ret+'\n') 9 f.close() 10 11 # file: 12 # {"\u56fd\u7c4d": "\u4e2d\u56fd"}{"\u56fd\u7c4d": "\u4e2d\u56fd"} 13 # {"国籍": "美国"}{"国籍": "美国"}
参数说明:
Skipkeys:默认值是False,若是dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key ensure_ascii:,当它为True的时候,全部非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False便可,此时存入json的中文便可正常显示。) indent:应该是一个非负的整型,若是是0就是顶格分行显示,若是为空就是一行最紧凑显示,不然会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json separators:分隔符,其实是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。 default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. sort_keys:将数据根据keys的值进行排序。
1 import json 2 data = {'username':['李华','二愣子'],'sex':'male','age':16} 3 json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) 4 print(json_dic2) 5 #result: 6 # { 7 # "age":16, 8 # "sex":"male", 9 # "username":[ 10 # "李华", 11 # "二愣子" 12 # ] 13 # }
dumps():序列化,将对象转成字符串并经过文件句柄输出到文件
loads():反序列化,经过文件句柄读取文件字符串内容并转成对象
1 import json 2 f = open('json_file','w') 3 dic = {'k1':'v1','k2':'v2','k3':'v3'} 4 json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 5 f.close() 6 7 f = open('json_file') 8 dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 9 f.close() 10 print(type(dic2),dic2)
用于python特有的类型和python的数据类型间进行转换
序列化,将对象转换为bytes
反序列化,将bytes转换成对象
1 str_dic = pickle.dumps(dic) 2 print( 3 str_dic) # b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.' 4 5 dic2 = pickle.loads(str_dic) 6 print(dic2) # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 7 8 import time
序列化,将对象转换为bytes,并经过文件句柄保存到文件
反序列化,经过文件句柄读取bytes并转换成对象
1 import pickle 2 import time 3 4 struct_time = time.localtime(1000000000) 5 print( 6 struct_time) # time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=9, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=252, tm_isdst=0) 7 f = open('pickle_file', 'wb') 8 pickle.dump(struct_time, f) 9 f.close() 10 11 f = open('pickle_file', 'rb') 12 struct_time2 = pickle.load(f) 13 print(struct_time2.tm_year) # 2001
经过文件句柄序列化同步到文件
1 import shelve 2 3 f1 = shelve.open('shelve_file') 4 f1['key'] = {1: 'a'} 5 f1.close() 6 # writeback为True时,所作变动会同步到文件 7 f2 = shelve.open('shelve_file', writeback=True) 8 print(f2['key']) # {1: 'a'} 9 f2['key']['new_value'] = 'this was not here before' 10 print(f2['key']) # {1: 'a', 'new_value': 'this was not here before'} 11 f2.close()
1 import hashlib 2 3 str = '123' 4 md5_helper = hashlib.md5() 5 md5_helper.update(bytes(str, 'utf-8')) 6 print(md5_helper.hexdigest()) # 202cb962ac59075b964b07152d234b70 7 8 sha_helper = hashlib.sha1() 9 sha_helper.update(bytes(str, 'utf-8')) 10 print(sha_helper.hexdigest()) # 40bd001563085fc35165329ea1ff5c5ecbdbbeef
1 import hashlib 2 3 str = '123' 4 md5_helper = hashlib.md5() 5 md5_helper.update(bytes(str, 'utf-8')) 6 print(md5_helper.hexdigest()) # 202cb962ac59075b964b07152d234b70 7 # 加盐 8 md5_salt_helper = hashlib.md5("salt".encode("utf8")) 9 md5_salt_helper.update(bytes(str, 'utf-8')) 10 print(md5_salt_helper.hexdigest()) # 8c4fb7bf681156b52fea93442c7dffc9
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 config["DEFAULT"] = {'ServerAliveInterval': '45', 6 'Compression': 'yes', 7 'CompressionLevel': '9', 8 'ForwardX11': 'yes' 9 } 10 11 config['bitbucket.org'] = {'User': 'hg'} 12 13 config['topsecret.server.com'] = {'Host Port': '50022', 'ForwardX11': 'no'} 14 15 with open('example.ini', 'w') as configfile: 16 config.write(configfile) 17 18 # example.ini: 19 # [DEFAULT] 20 # serveraliveinterval = 45 21 # compression = yes 22 # compressionlevel = 9 23 # forwardx11 = yes 24 # 25 # [bitbucket.org] 26 # user = hg 27 # 28 # [topsecret.server.com] 29 # host 30 # port = 50022 31 # forwardx11 = no
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 # ---------------------------查找文件内容,基于字典的形式 6 7 print(config.sections()) # [] 8 9 config.read('example.ini') 10 11 print(config.sections()) # ['bitbucket.org', 'topsecret.server.com'] 12 13 print('bytebong.com' in config) # False 14 print('bitbucket.org' in config) # True 15 16 print(config['bitbucket.org']["user"]) # hg 17 18 print(config['DEFAULT']['Compression']) # yes 19 20 print(config['topsecret.server.com']['ForwardX11']) # no 21 22 print(config['bitbucket.org']) # <Section: bitbucket.org> 23 24 # 注意,有default会默认default的键 25 for key in config['bitbucket.org']: 26 print(key) 27 # user 28 # serveraliveinterval 29 # compression 30 # compressionlevel 31 # forwardx11 32 33 # 同for循环,找到'bitbucket.org'下全部键 34 print( 35 config.options('bitbucket.org')) # ['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11'] 36 # 找到'bitbucket.org'下全部键值对 37 print(config.items( 38 'bitbucket.org')) # [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')] 39 # 获取Section下的key对应的value 40 print(config.get('bitbucket.org', 'compression')) # yes
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 config.read('example.ini') 6 7 config.add_section('yuan') 8 9 config.remove_section('bitbucket.org') 10 config.remove_option('topsecret.server.com', "forwardx11") 11 12 config.set('topsecret.server.com', 'k1', '11111') 13 config.set('yuan', 'k2', '22222') 14 with open('new.ini', "w") as f: 15 config.write(f) 16 17 # example.ini: 18 # [DEFAULT] 19 # serveraliveinterval = 45 20 # compression = yes 21 # compressionlevel = 9 22 # forwardx11 = yes 23 # 24 # [bitbucket.org] 25 # user = hg 26 # 27 # [topsecret.server.com] 28 # host port = 50022 29 # forwardx11 = no 30 31 # new.ini: 32 # [DEFAULT] 33 # serveraliveinterval = 45 34 # compression = yes 35 # compressionlevel = 9 36 # forwardx11 = yes 37 # 38 # [topsecret.server.com] 39 # host port = 50022 40 # k1 = 11111 41 # 42 # [yuan] 43 # k2 = 22222
1 import logging 2 logging.debug('debug message') 3 logging.info('info message') 4 logging.warning('warning message') 5 logging.error('error message') 6 logging.critical('critical message')
默认状况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)
中文会出现乱码状况
1 import logging 2 3 logging.basicConfig(level=logging.DEBUG, 4 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 5 datefmt='%a, %d %b %Y %H:%M:%S', 6 filename='test.log', 7 filemode='w') 8 9 logging.debug('debug message') 10 logging.info('info message') 11 logging.warning('warning message') 12 logging.error('error message') 13 logging.critical('critical message') 14 15 # test.log: 16 # Tue, 04 Sep 2018 22:10:44 logging�.py[line:19] DEBUG debug message 17 # Tue, 04 Sep 2018 22:10:44 logging�.py[line:20] INFO info message 18 # Tue, 04 Sep 2018 22:10:44 logging�.py[line:21] WARNING warning message 19 # Tue, 04 Sep 2018 22:10:44 logging�.py[line:22] ERROR error message 20 # Tue, 04 Sep 2018 22:10:44 logging�.py[line:23] CRITICAL critical message
1 import logging 2 3 logger = logging.getLogger() 4 # 建立一个handler,用于写入日志文件 5 fh = logging.FileHandler('test.log', encoding='utf-8') 6 7 # 再建立一个handler,用于输出到控制台 8 ch = logging.StreamHandler() 9 formatter = logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s - %(message)s') 10 11 fh.setLevel(logging.DEBUG) 12 13 fh.setFormatter(formatter) 14 ch.setFormatter(formatter) 15 ##logger对象能够添加多个fh和ch对象 16 logger.addHandler(fh) 17 logger.addHandler(ch) 18 19 logger.debug('logger debug message') 20 logger.info('logger info message') 21 logger.warning('logger warning message') 22 logger.error('logger error message') 23 logger.critical('logger critical message') 24 25 #test.log: 26 # 2018-09-04 22:19:08,855 - logging模块.py - WARNING - logger warning message 27 # 2018-09-04 22:19:08,855 - logging模块.py - ERROR - logger error message 28 # 2018-09-04 22:19:08,855 - logging模块.py - CRITICAL - logger critical message
logging.basicConfig()函数中可经过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名建立FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream建立StreamHandler。能够指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为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:线程名。可能没有 %进程ID。可能没有 %(message)s:用户输出的消息