python 模块
模块
一.os
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
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.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
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以/或\结尾,那么就会返回空值。即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的大小
二.logging模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import logging logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s %(lineno)d %(levelname)s %(message)s' , datefmt = '%Y-%m-%d %X' , filename = 'log.txt' , filemode = 'w' ) logging.debug( 'debug message' ) logging.info( 'info message' ) logging.warning( 'warning message' ) logging.error( 'error message' ) logging.critical( 'critical message' ) |
1 logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
2
3 filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
4 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
5 format:指定handler使用的日志显示格式。
6 datefmt:指定日期时间格式。
7 level:设置rootlogger(后边会讲解具体概念)的日志级别
8 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
9
10 format参数中可能用到的格式化串:
11 %(name)s Logger的名字
12 %(levelno)s 数字形式的日志级别
13 %(levelname)s 文本形式的日志级别
14 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
15 %(filename)s 调用日志输出函数的模块的文件名
16 %(module)s 调用日志输出函数的模块名
17 %(funcName)s 调用日志输出函数的函数名
18 %(lineno)d 调用日志输出函数的语句所在的代码行
19 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
20 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
21 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
22 %(thread)d 线程ID。可能没有
23 %(threadName)s 线程名。可能没有
24 %(process)d 进程ID。可能没有
25 %(message)s用户输出的消息
26
27 配置参数
logger对象配置
def logger():
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(lineno)d %(levelname)s %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
return logger
logger=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')
一、re
#字符匹配(普通字符,元字符)
#普通字符
#元字符
. ^ $ * ? + {} [] | () \
\: 反斜杠后边跟元字符去除特殊功能
反斜杠后边跟普通字符实现特殊功能
引用序号对应的字组所匹配的字符串
\d 匹配任何十进制数,[0-9]
\D 匹配任何非数字字符,[^0-9]
\s 匹配任何空白字符,[\t\n\r\f\v]
\S 匹配任何非空白字符,[ ^ \t\n\r\f\v]
\w 匹配任何数字字母字符,[a-zA-Z0-9_]
\W 匹配任何非字母数字字符,[^a-zA-Z0-9_]
\b 匹配一个单词边界,也就是指单词和空格间的位置
1 origin = "hello world hi"
2
3 r = re.match("h\w+",origin)
4 print(r.group()) #获取匹配到的所有结果
5 hello
6
7 r = re.match("(h)(\w+)",origin)
8 print(r.groups()) #获取模型中匹配到的分组结果
9 ('h', 'ello')
10
11 r = re.match("(?P<n1>h)(?P<n2>\w+)",origin)
12 {'n1': 'h', 'n2': 'ello'}
13
14 re.match #从头匹配
1 origin = "hello alex alex bcd abcd lge acd 19"
2
3 r = re.finditer("(a)((\w+)(e))(?P<n1>x)",origin)
4 for i in r:
5 print(i)
6 <_sre.SRE_Match object; span=(6, 10), match='alex'>
7 print(i.group())
8 alex
9 print(i.groupdict())
10 {'n1': 'x'}
11
12 re.finditer
1 import re
2
3 origin = "hello alex hello alex bcd abcd lge acd 19"
4
5
6 # .
7
8 print(re.findall("h...o",origin))
9 ['hello', 'hello']
10
11
12 # ^
13
14 print(re.findall("^h...o",origin))
15 ['hello']
16
17 # $
18
19 print(re.findall("h...o$",origin))
20 []
21
22 # ?
23
24 print(re.findall("d?","aaaddddccc"))
25 ['', '', '', 'd', 'd', 'd', 'd', '', '', '', '']
26
27 # +
28
29 print(re.findall("d+","aaaddddccc"))
30 ['dddd']
31
32 # *
33
34 print(re.findall("d*","aaaddddccc"))
35 ['', '', '', 'dddd', '', '', '', '']
36
37 # {}
38
39 print(re.findall("d{4}","aaaddddccc"))
40 ['dddd']
41
42 #注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
43 print(re.findall("ad*?","addddccc"))
44 ['a']
45
46 print(re.findall("ad*?","aaaaddddccc"))
47 ['a', 'a', 'a', 'a']
48
49
50 # [] []里面只有 ^ - \ 有特殊含义
51
52
53 print(re.findall("a[bc]d","abdfffacd"))
54 ['abd', 'acd']
55
56 print(re.findall("q[a-z]","qab"))
57 ['qa']
58
59 print(re.findall("q[^a-z]*","q12355"))
60 ['q12355']
61
62
63 #匹配括号中没有括号
64 print(re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))"))
65 ['(2-1)']
66
67 re.findall #将匹配到的内容放到一个列表里
1 # search ()
2
3 print(re.search("(?P<name>[a-z]+)","alex36wusir34egon33").group())
4 alex
5
6 print(re.search("(?P<name>[a-z]+)\d+","alex36wusir34egon33").group())
7 alex36
8
9 print(re.search("(?P<name>[a-z]+)\d+","alex36wusir34egon33").group("name"))
10 alex
11
12 print(re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34egon33").group("age"))
13
14 re.search
1 #split 切割
2
3 print(re.split(" ","alex egon hao"))
4 ['alex', 'egon', 'hao']
5
6 print(re.split("[ |]","alex egon|hao"))
7 ['alex', 'egon', 'hao']
8
9 print(re.split("[ab]","abc"))
10 ['', '', 'c']
11
12 print(re.split("[ab]","asdabcd"))
13 ['', 'sd', '', 'cd']
14
15 re.split 切割
1 #sub 替换
2
3 #将数字替换成A
4 print(re.sub("\d+","A","aakk123ddd55kk66"))
5 aakkAdddAkkA
6
7 #匹配前4次
8 print(re.sub("\d","A","aakk123ddd55kk66",4))
9 aakkAAAdddA5kk66
10
11
12 #subn 替换的次数按元组显示出来
13
14 print(re.subn("\d","A","aakk123ddd55kk66"))
15 ('aakkAAAdddAAkkAA', 7)
16
17 #sub 替换
1 # () 优先显示括号中的内容
2
3 print(re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))"))
4 ['(2-1)']
5
6 print(re.findall("www\.(baidu|163)\.com","www.baidu.com"))
7 ['baidu']
8
9 print(re.findall("www\.(?:baidu|163)\.com","www.baidu.com"))
10 ['www.baidu.com']
11
12 print(re.findall("(abc)+","abcabcabc"))
13 ['abc']
14
15 print(re.findall("(?:abc)+","abcabcabc"))
16 ['abcabcabc']
17
18 () 优先显示括号中的内容