您好!此笔记的文本和代码以网盘形式分享于文末!
因个人能力有限,错误处欢迎大家交流和指正!基础部分内容简单,但多且零散!
python 常用模块 | ||
1、collections模块,除内置dict、list、set、tuple数据类型,collections提供了额外的数据类型。 | ||
namedtuple: 生成可以使用名字来访问元素内容的tuple deque: 双端队列,可以快速的从另外一侧追加和推出对象 Counter: 计数器,主要用来计数 OrderedDict: 有序字典 defaultdict: 带有默认值的字典 | ||
用法 | 栗子 | 结果 |
namedtuple 表示二维坐标 | # namedtuple 生成可以使用名字来访问元素内容的tuple from collections import namedtuple import math # 表示二维坐标 point = namedtuple('point', ['x', 'y']) p = point(1, 2) print(p.x, p.y) # 圆心和半径来表示圆 Circle = namedtuple('Circle', ['x', 'y', 'r']) c = Circle(1, 2, 5) c_area = math.pi * math.pow(c.r, 2) print('圆的面积为', c_area) | 1 2 圆的面积为 78.53981633974483 |
deque 高效的插入和删除 适用于队列和栈 | # 实现了list的append、pop、appendleft、popleft的功能, # 高效的往头部添加和删除元素 from collections import deque q = deque(['a', 'b', 'c']) q.append('x') q.appendleft('y') print(q, type(q)) | deque(['y', 'a', 'b', 'c', 'x']) <class 'collections.deque'> |
OrderedDict 保持key顺序, 方便迭代使用 | from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od, type(od)) # 按照插入顺序返回 od['z'] = 4 od['x'] = 5 od['y'] = 6 print(od) | py3.6后 字典有默认的顺序 {'a': 1, 'b': 2, 'c': 3} OrderedDict([('a', 1), ('b', 2), ('c', 3)]) <class 'collections.OrderedDict'> OrderedDict([('a', 1), ('b', 2), ('c', 3), ('z', 4), ('x', 5), ('y', 6)]) |
# 将集合中所有大于66保存至‘k1’ # 即 {'k1': 大于66 , 'k2': 小于66} values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = {} for value in values: if value > 66: if my_dict.__contains__('k1'): my_dict['k1'].append(value) else: my_dict['k1'] = [value] else: if my_dict.__contains__('k2'): my_dict['k2'].append(value) else: my_dict['k2'] = [value] print(my_dict) | {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]} | |
defaultdict 实现上边的功能 指定了字典的 value值的类型 | from collections import defaultdict values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = defaultdict(list) for value in values: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) | defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}) |
# 引用字典key值,防止不存在保存 from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' print(dd['key1'], dd['key2']) | abc N/A | |
Counter 计数器 记录元素出现的次数 返回键值对无序容器 | from collections import Counter c = Counter('abcdeabcdabcaba') print(c, type(c)) | Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) <class 'collections.Counter'> |
2、时间模块time | https://www.cnblogs.com/Eva-J/articles/7291842.html | |
时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的 | ||
用法 | 栗子 | 结果 |
时间戳 时间字符串 元组 | import time # 获取时间戳 print(time.time()) # 时间字符串 print(time.strftime("%Y-%m-%d %X")) print(time.strftime("%Y-%m-%d %H-%M-%S")) # 时间元组:localtime 将一个时间戳转换成当时区的 print(time.localtime()) | 展示结果为: 1500875844.800804 2017-07-24 13:54:37 2017-07-24 13-55-04 time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=13, tm_min=59, tm_sec=37, tm_wday=0, tm_yday=205, tm_isdst=0) |
# # UTC 伦敦时间 # print(time.gmtime()) # # 当地时间 # print(time.localtime()) | ||
# # 时间戳 --> 结构化时间 # # UTC 时间与北京时间差8小时 # print(time.gmtime(1500000000)) # print(time.localtime(1500000000)) | ||
# # 结构化时间 --> 时间戳 # time_tuple = time.localtime(1800000000) # print(time_tuple) # print(time.mktime(time_tuple)) | ||
# # 结构化时间 --> 字符串时间 # # time.strftime("格式定义","结构化时间") # print(time.strftime("%Y-%m-%d %X")) # print(time.strftime("%Y-%m-%d", time.localtime(1800000000))) | ||
# # 字符串时间 --> 结构化时间 # # time.strptime(时间字符串,字符串对应格式) # print(time.strptime("2017-03-16", "%Y-%m-%d")) # print(time.strptime("03/16/2017", "%m/%d/%Y")) | ||
# # 结构化时间 --> %a %b %d %H:%M:%S %Y串 # # time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串 # print(time.asctime(time.localtime(1800000000))) # print(time.asctime()) | ||
# # 时间戳 --> %a %b %d %H:%M:%S %Y串 # # time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 # print(time.ctime()) # print(time.ctime(1800000000)) | ||
3、random 模块:import random | ||
用法 | 栗子 | 结果 |
随机小数 | # 随机小数 0<x<1 print(random.random()) # 可定范围,例1<x<3 print(random.uniform(1, 3)) | |
随机整数 | # 随机整数 例1<x<=5 print(random.randint(1, 5)) # 随机整数 例1<x<=10的奇数 2为递增基数 print(random.randrange(1, 10, 2)) # 随机整数 例0<x<=10的偶数 2为递增基数 print(random.randrange(0, 10, 2)) | |
随机返回 | # 随机一个返回 print(random.choice([1, '23', [4, 5]])) # 指定随机多个返回,例2个 print(random.sample([1, '23', [4, 5]], 2)) | |
打乱列表 | # 打乱列表的顺序 item = [1, 2, 4, 5, 3, 6] random.shuffle(item) print(item) | |
随机验证码 例:生成5位随机码 | import random def v_code(): code = '' for i in range(5): num = random.randint(0, 9) alf = chr(random.randint(65, 90)) add = random.choice([num, alf]) code = "".join([code, str(add)]) return code print(v_code()) | NK4XV |
4、OS模块:os模块是与操作系统交互的一个接口 | ||
用法 | 栗子 | 结果 |
# OS 模块与操作系统交互的一个接口 # 可生成多层递归目录 # os.makedirs('dirname1/dirname2') # 若目录为空,则删除,并递归到上一级目录, # 如若也为空,则删除,依此类推 # os.removedirs('dirname1') # 生成单级目录;相当于shell中mkdir dirname # os.mkdir('dirname') # 删除单级空目录,若目录不为空则无法删除,报错; # os.rmdir('dirname') # 列出指定目录下的所有文件和子目录, # 包括隐藏文件,并以列表方式打印 # os.listdir('dirname') # 删除一个文件 # os.remove() # 重命名文件/目录 # os.rename("oldname","newname") # 获取文件/目录信息 # os.stat('path/filename') # 运行shell命令 直接显示 # os.system('bash command') # 运行shell命令,获取执行结果 # os.popen("bash command).read() | ||
# 获取当前工作目录 print(os.getcwd()) # 改变当前脚本工作目录;相当于shell下cd os.chdir(r'E:\pytext\003') print(os.getcwd()) os.chdir(r'E:\pytext\002') print(os.getcwd()) | E:\pytext\002 E:\pytext\003 E:\pytext\002 | |
os.path 模块 | # 返回path规范化的绝对路径 # os.path.abspath(path) # 将path分割成目录和文件名二元组返回 # os.path.split(path) # 返回path的目录。其实就是os.path.split(path)的第一个元素 # os.path.dirname(path) # 返回path最后的文件名。如何path以/或\结尾, # 那么就会返回空值。即os.path.split(path)的第二个元素 # os.path.basename(path) # 如果path存在,返回True;如果path不存在,返回False # os.path.exists(path) # 如果path是绝对路径,返回True # os.path.isabs(path) # 如果path是一个存在的文件,返回True。否则返回False # os.path.isfile(path) # 如果path是一个存在的目录,则返回True。否则返回False # os.path.isdir(path) # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 # os.path.join(path1[, path2[, ...]]) # 返回path所指向的文件或者目录的最后访问时间 # os.path.getatime(path) # 返回path所指向的文件或者目录的最后修改时间 # os.path.getmtime(path) # 返回path的大小 # os.path.getsize(path) | |
stat 结构: | st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小; 包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。 在某些系统上(如Unix)是最新的元数据更改的时间, 在其它系统上(如Windows)是创建时间 | |
# # 输出操作系统特定的路径分隔符 print(os.sep) # # 输出当前平台使用的行终止符 print(os.linesep) # 输出用于分割文件路径的字符串 print(os.pathsep) # 输出字符串指示当前使用平台 print(os.name) | \ ; nt | |
5、sys模块是与python解释器交互的一个接口 | ||
# 返回操作系统平台名称 print(sys.platform) | ||
# # 获取Python解释程序的版本信息 print(sys.version) | ||
# # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 print(sys.path) | ||
sys.argv | ||
6、序列化:将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化 | ||
序列化目的:1>以某种存储形式使自定义对象持久化; 2>将对象从一个地方传递到另一个地方。 3>使程序更具维护性 | ||
json,用于字符串 和 python数据类型间进行转换 | ||
json是一种所有的语言都可以识别的数据结构。 | ||
pickle,用于python特有的类型 和 python的数据类型间进行转换 | ||
用法 | 栗子 | 结果 |
json 字典转换成字符串 loads和dumps | # # 将一个字典转换成一个字符串 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} str_dic = json.dumps(dic) print(str_dic, type(str_dic)) # 反序列化:将字符串格式的字典转化为字典 dic2 = json.loads(str_dic) print(dic2, type(dic2)) | {"k1": "v1", "k2": "v2", "k3": "v3"} <class 'str'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'> |
json dump和load | # dump 接收文件句柄,直接将字典转成json字符串写入文件 import json f = open('json_file', 'w') dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} json.dump(dic, f) f.close() # load接收文件句柄,将文件中的json字符串转成数据结构 f = open('json_file') dic2 = json.load(f) f.close() print(dic2, type(dic2)) | json_file文件及内容 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'> |
json dumps ensure_ascii参数 | import json f = open('file', 'w') json.dump({'国籍': '中国'}, f) ret = json.dumps({'国籍': '中国'}) f.write(ret+'\n') json.dump({'国籍': '美国'}, f, ensure_ascii=False) ret = json.dumps({'国籍': '美国'}, ensure_ascii=False) f.write(ret+'\n') f.close() | |
其他参数 | ||
json Json的格式化输出 indent 空几格 | import json data = {'username': ['李华', '二愣子'], 'sex': 'male', 'age': 16} json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False) print(json_dic2) | { "age":16, "sex":"male", "username":[ "李华", "二愣子" ] } |
pickle dumps 和 loads | import pickle # dumps dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} str_dic = pickle.dumps(dic) # 转成bytes类型数据 print(str_dic, type(str_dic)) # loads 反序列化、读 dic2 = pickle.loads(str_dic) print(dic2) | 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.' <class 'bytes'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} |
pickle dump和lload | import time struct_time = time.localtime(1800000000) print(struct_time) f = open('pickle_file', 'wb') # dump 序列化存 pickle.dump(struct_time, f) f.close() # load(不仅可以序列化字典,列表... # 还可以把python中任意的数据类型序列化) f = open('pickle_file', 'rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year) | |
7、re模块:正则表达式方法模块,拥有全部的正则表达式功能 | <------获取匹配的函数 | |
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号, 在这种情况下它将返回一个包含那些组所对应值的元组。 | |
groups() | 返回包含所有小组字符串的元组,从1到所含的小组 | |
groupdict() | 返回以有别名的组的别名为键、以该组截获的子串为值的字典 | |
start() | 返回匹配开始的位置 | |
end() | 返回匹配结束的位置 | |
span() | 返回一个元组包含匹配(开始,结束)的位置 | |
findall | # findall 返回所有满足匹配条件的结果,放在列表 """ findall(pattern, string, flags=0): pattern:匹配的正则表达式 string:要匹配的字符串 flags:标记为,用于控制正则表达式的匹配方式 """ ret = re.findall('l', 'lion simba trglion') print(ret) | ['l', 'l'] |
findall 的优先级查询 | ret = re.findall('www.(baidu|csdn).com', 'www.csdn.com') print(ret) # 如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|csdn).com', 'www.csdn.com') print(ret) | ['csdn'] ['www.csdn.com'] |
finditer | # finditer返回所有满足RE的结果,存放结果在迭代器 """ finditer(pattern, string, flags=0) pattern:匹配的正则表达式 string:要匹配的字符串 flags:标记为,用于控制正则表达式的匹配方式 """ ret = re.finditer('\d', 'ds3sy4784a') print(ret) print(next(ret).group()) print(next(ret).group()) print([i.group() for i in ret]) | <callable_iterator object at 0x0000022C0CFDD358> 3 4 ['7', '8', '4'] |
search | # search 扫描整个字符串并返回第一个成功的匹配 """ search(pattern, string, flags=0) pattern:匹配的正则表达式 string:要匹配的字符串 flags:标记为,用于控制正则表达式的匹配方式 """ ret = re.search('l', 'lion simba trglion') ret1 = re.search('l', 'lion simba trglion').group() # 如果字符串没有匹配会报错 # ret2 = re.search('c', 'lion simba trglion').group() ret3 = re.search('c', 'lion simba trglion') print(ret, '\nret1:', ret1, '\nret3:', ret3) | <_sre.SRE_Match object; span=(0, 1), match='l'> ret1: l ret3: None |
match | # match 从字符串的起始位置匹配, # 如果起始位置匹配不成功的话,match()就返回none """ match(pattern, string, flags=0) pattern:匹配的正则表达式 string:要匹配的字符串 flags:标记为,用于控制正则表达式的匹配方式 """ ret = re.match('a', 'abc') ret1 = re.match('a', 'abc').group() ret2 = re.match('b', 'abc') print(ret, '\nret1:', ret1, '\nret2:', ret2) | <_sre.SRE_Match object; span=(0, 1), match='a'> ret1: a ret2: None |
split | # split 按照匹配的子串将字符串分割后返回列表 """ split(pattern, string, maxsplit=0, flags=0) pattern:匹配的正则表达式 string:要匹配的字符串 maxsplit: 分割次数,默认为0 不限制次数 flags:标记为,用于控制正则表达式的匹配方式 """ ret = re.split('[ab]', 'abcd') ret1 = re.split('[ab]', 'abcd', 1) ret2 = re.split('[ab]', 'aAcd') # re.I 是正则表达式修饰符,使匹配对大小写不敏感 ret3 = re.split('[ab]', 'aAcd', flags=re.I) print('ret:', ret, '\nret1:', ret1, '\nret2:', ret2, '\nret3:', ret3,) | ret: ['', '', 'cd'] ret1: ['', 'bcd'] ret2: ['', 'Acd'] ret3: ['', '', 'cd'] |
split的优先级查询 | # split的优先级查询 有无() 的结果大不同 ret = re.split("\d+", "eva3egon4yuan") print(ret) ret = re.split("(\d+)", "eva3egon4yuan") print(ret) | ['eva', 'egon', 'yuan'] ['eva', '3', 'egon', '4', 'yuan'] |
sub | # sub 替换匹配到的字符串 """ sub(pattern, repl, string, count=0, flags=0) pattern:匹配的正则表达式 repl:替换为字符串,也可作为一个函数 string:要匹配的字符串 count:模式匹配后替换的最大次数,默认0表示替换所有匹配 flags:标记为,用于控制正则表达式的匹配方式 """ ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1) print('ret :', ret) ret1 = re.sub('\d', 'h', ret, 1) print('ret1:', ret1) ret2 = re.sub('a', 'W', ret, 3) print('ret2:', ret2) ret3 = re.sub('H', '5', ret1) print('ret3:', ret3) ret4 = re.sub('H', '5', ret1, flags=re.I) print('ret4:', ret4) | ret : evaHegon4yuan4 ret1: evaHegonhyuan4 ret2: evWHegon4yuWn4 ret3: eva5egonhyuan4 ret4: eva5egon5yuan4 |
subn | # subn 替换匹配到的字符串返回元组(替换结果,替换次数) """ subn(pattern, repl, string, count=0, flags=0) """ ret = re.subn('\d', 'H', 'eva3egon4yuan4') print(ret) | ('evaHegonHyuanH', 3) |
compile | # compile 编译正则表达式,生成一个正则表达式(Pattern)对象 # 供 match() 和 search() 这两个函数使用 """ compile(pattern, flags=0): """ # 将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 obj = re.compile('\d{3}') obj = re.compile('\d{2}') # 正则表达式对象调用search,参数为待匹配的字符串 ret = obj.search('4a5b6c123eeee') ret1 = obj.match('4a5b6c123eeee') ret3 = obj.match('44a5b6c123eeee') print(ret.group(), ret1, ret3.group()) | 12 None 44 |
练习 | ||
8、hashlib模块:提供了常见的摘要算法,如MD5,SHA1等,摘要算法又称哈希算法、散列算法 | ||
# MD5值计算 | # MD5值计算 m = hashlib.md5() m.update("ling".encode("utf-8")) print(m.hexdigest()) # md5计算 nm5 = hashlib.new('md5', "ling".encode("utf-8")).hexdigest() print(nm5) # ‘加盐’ m1 = hashlib.md5("1234567".encode("utf-8")) m1.update("ling".encode("utf-8")) print(m1.hexdigest()) # sha1计算 hs = hashlib.sha1() hs.update("ling".encode("utf-8")) print(hs.hexdigest()) # sha256 计算 hs1 = hashlib.sha256() hs1.update("ling".encode("utf-8")) print(hs1.hexdigest()) # hmac的使用 h = hmac.new("1234567".encode("utf-8"), "ling".encode("utf-8"), digestmod='md5') print(h.hexdigest()) h1 = hmac.new("1234567".encode("utf-8")) h1.update("ling".encode("utf-8")) print(h1.hexdigest()) | 24c10be286b009f797d53126790fcfd8 24c10be286b009f797d53126790fcfd8 adf67c5212bc655192931cb54efd3111 3275142b880fd39f1dbd64201d4e22e370d61f98 6cd4c9c389b460a1f60357bebdec27a788c4abbf1aa3dead4d3c0cfd0cebea2a 1154278ab2838e38d54270bcbaedf989 1154278ab2838e38d54270bcbaedf989 |
9、configparser模块: | ||
# 生成配置文档 config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9', 'ForwardX11': 'yes' } config['bitbucket.org'] = {'User': 'hg'} config['topsecret.server.com'] = {'Host Port': '50022', 'ForwardX11': 'no'} with open('example.ini', 'w') as configfile: config.write(configfile) | [DEFAULT] serveraliveinterval = 45 compression = yes compressionlevel = 9 forwardx11 = yes [bitbucket.org] user = hg [topsecret.server.com] host port = 50022 forwardx11 = no | |
# 读取和查找文件 # 查找文件内容,基于字典的形式 config = configparser.ConfigParser() print(config.sections()) # 读取 config.read('example.ini') print(config.sections()) print('bytebong.com' in config) print('bitbucket.org' in config) print(config['bitbucket.org']["user"]) print(config['DEFAULT']['Compression']) print(config['topsecret.server.com']['ForwardX11']) print(config['bitbucket.org']) # 注意,有default会默认default的键 for key in config['bitbucket.org']: print(key) print(config.options('bitbucket.org')) # 同for循环 # 找到'bitbucket.org'下所有键值对 print(config.items('bitbucket.org')) # get方法Section下的key对应的value print(config.get('bitbucket.org','compression')) | [] ['bitbucket.org', 'topsecret.server.com'] False True hg yes no <Section: bitbucket.org> user serveraliveinterval compression compressionlevel forwardx11 ['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11'] [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')] yes | |
未成功 | # 增删改操作 config = configparser.ConfigParser() config.read('example.ini') config.add_section('yuan') config.remove_section('bitbucket.org') config.remove_option('topsecret.server.com', "forwardx11") config.set('topsecret.server.com', 'k1', '11111') config.set('yuan', 'k2', '22222') config.write(open('new2.ini', "w")) | |
10、logging日志模块 | ||
函数 | 说明 | |
logging.debug(msg, *args, **kwargs) | 创建一条严重级别为DEBUG的日志记录 | |
logging.info(msg, *args, **kwargs) | 创建一条严重级别为INFO的日志记录 | |
logging.warning(msg, *args, **kwargs) | 创建一条严重级别为WARNING的日志记录 | |
logging.error(msg, *args, **kwargs) | 创建一条严重级别为ERROR的日志记录 | |
logging.critical(msg, *args, **kwargs) | 创建一条严重级别为CRITICAL的日志记录 | |
logging.log(level, *args, **kwargs) | 创建一条严重级别为level的日志记录 | |
logging.basicConfig(**kwargs) | 对root logger进行一次性配置 | |
""" 日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG 默认只显示了大于等于WARNING级别的日志, """ logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') | WARNING:root:warning message ERROR:root:error message CRITICAL:root:critical message | |
logging.basicConfig() | # logging.basicConfig()函数调整日志级别、输出格式 logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(name)s %(levelname)s %(message)s", datefmt='%Y-%m-%d %H:%M:%S %a' ) logging.debug("msg1") logging.info("msg2") logging.warning("msg3") logging.error("msg4") logging.critical("msg5") | |
# 生成日志文件 # 配置输出日志格式 LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s" # 配置输出时间的格式,注意月份和天数 DATE_FORMAT = '%Y-%m-%d %H:%M:%S %a' # 利用filename参数将日志内容直接写入文件 logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT, filename=r"E:/pytext/002/test.log" ) logging.debug("msg1") logging.info("msg2") logging.warning("msg3") logging.error("msg4") logging.critical("msg5") | ||
日志的切割 | 欠 | |
logging模块中定义好的可以用于format格式字符串说明 | ||
字段/属性名称 | 描述 | 使用格式 |
asctime | 将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒 | %(asctime)s |
name | 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger | %(name)s |
filename | 调用日志输出函数的模块的文件名; pathname的文件名部分,包含文件后缀 | %(filename)s |
funcName | 由哪个function发出的log, 调用日志输出函数的函数名 | %(funcName)s |
levelname | 日志的最终等级(被filter修改后的) | %(levelname)s |
message | 日志信息, 日志记录的文本内容 | %(message)s |
lineno | 当前日志的行号, 调用日志输出函数的语句所在的代码行 | %(lineno)d |
levelno | 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50) | %(levelno)s |
pathname | 完整路径 ,调用日志输出函数的模块的完整路径名,可能没有 | %(pathname)s |
process | 当前进程, 进程ID。可能没有 | %(process)s |
processName | 进程名称,Python 3.1新增 | %(processName)s |
thread | 当前线程, 线程ID。可能没有 | %(thread)s |
threadName | 线程名称 | %(thread)s |
module | 调用日志输出函数的模块名, filename的名称部分,不包含后缀即不包含文件后缀的文件名 | %(module)s |
created | 当前时间,用UNIX标准的表示时间的浮点数表示; 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值 | %(created)f |
relativeCreated | 输出日志信息时的,自Logger创建以 来的毫秒数; 日志事件发生的时间相对于logging模块加载时间的相对毫秒数 | %(relativeCreated)d |
msecs | 日志事件发生事件的毫秒部分。logging.basicConfig()中用了参数datefmt,将会去掉asctime中产生的毫秒部分,可以用这个加上 | %(msecs)d |
元字符 | ||
量词 | 量词用法说明 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 |
愿有更多的朋友,在网页笔记结构上分享更逻辑和易读的形式:
链接:暂无
提取码:暂无