[010]Python的函数_常用模块_全栈基础

您好!此笔记的文本和代码以网盘形式分享于文末!

因个人能力有限,错误处欢迎大家交流和指正!基础部分内容简单,但多且零散!

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、时间模块timehttps://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次
 

愿有更多的朋友,在网页笔记结构上分享更逻辑和易读的形式:

链接:暂无
提取码:暂无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值