python学习之路 第六天
1、正则表达式
re.match() 从头匹配;
re.match("[0-9]","123abc789") 只匹配一个数字;
re.match("[0-9][0-5]","123abc789") 匹配0-5次数字;
re.match("[0-9][5]","123abc789") 只匹配5次数字,固定次数匹配;
print(m.group()) 查看匹配的结果
re.findall("[0-9]{0,10}",“123abc789”) 匹配所有数字,有0包含空;
re.findall("[a-zA-Z]{0,10}",“123abc789”) 匹配所有字母;
re.findall("[a-zA-Z]+",“123abc789”) 匹配1个或多个字母;
re.findall(".*",“123abc789”) 匹配所有,匹配0个或多个表达式;
re.findall(".+",“123abc789”) 匹配所有,匹配1个或多个表达式;
print(m) 查看匹配的结果;
re.rearch("[0-9]","123abc789") 不光从头匹配,都查找一遍;
re.sub("abc","456","123abc789") 456替换abc;
2、json,用于字符串与python数据类型间进行转换。Json模块挺了四个功能:dumps、dump、loads、load。所有语言共通。
3、pickle,用于python特有的类型和python的数据类型间进行转换。Pickle模块提供了四个功能:dumps、dump、loads、load。python语言专有的。
4、序列化:字符串转化成字典。 反序列化:字典转化成字符串。
5、OS模块 提供对操作系统进行调用的接口
(1)os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
(2)os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
(3)os.curdir 返回当前目录: ('.')
(4)os.pardir 获取当前目录的父目录字符串名:('..')
(5)os.makedirs('dirname1/dirname2') 可生成多层递归目录
(6)os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
(7)os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
(8)os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
(9)os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
(10)os.remove() 删除一个文件
(11)os.rename("oldname","newname") 重命名文件/目录
(12)os.stat('path/filename') 获取文件/目录信息
(13)os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
(14)os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
(15)os.pathsep 输出用于分割文件路径的字符串
(16)os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
(17)os.system("bash command") 运行shell命令,直接显示
(18)os.environ 获取系统环境变量
(19)os.path.abspath(path) 返回path规范化的绝对路径
(20)os.path.split(path) 将path分割成目录和文件名二元组返回
(21)os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
(22)os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
(23)os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
(24)os.path.isabs(path) 如果path是绝对路径,返回True
(25)os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
(26)os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
(27)os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
(28)os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
(29)os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
6、sys模块
(1)sys.argv 命令行参数List,第一个元素是程序本身路径
(2)sys.exit(n) 退出程序,正常退出时exit(0)
(3)sys.version 获取Python解释程序的版本信息
(4)sys.maxint 最大的Int值
(5)sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
(6)sys.platform 返回操作系统平台名称
(7)sys.stdout.write('please:')
(8)val = sys.stdin.readline()[:-1]
6、re模块 常用正则表达式符号
(1)re.match 从头开始匹配
(2)re.search 匹配包含
(3)re.findall 把所有匹配到的字符放到以列表中的元素返回
(4)re.splitall 以匹配到的字符当做列表分隔符
(5)re.sub 匹配字符并替换
- '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
- '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
- '$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
- '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
- '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
- '?' 匹配前一个字符1次或0次
- '{m}' 匹配前一个字符m次
- '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
- '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
- '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
- '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
- '\Z' 匹配字符结尾,同$
- '\d' 匹配数字0-9
- '\D' 匹配非数字
- '\w' 匹配[A-Za-z0-9]
- '\W' 匹配非[A-Za-z0-9]
- 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
7、shutil 高级的 文件、文件夹、压缩包 处理模块
- shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中,可以部分内容
- shutil.copyfile(src, dst) 拷贝文件
- shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变
- shutil.copystat(src, dst) 拷贝状态的信息,包括:mode bits, atime, mtime, flags
- shutil.copy(src, dst) 拷贝文件和权限
- shutil.copy2(src, dst) 拷贝文件和状态信息
- shutil.ignore_patterns(*patterns) shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件
- 例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
- shutil.rmtree(path[, ignore_errors[, onerror]]) 递归的去删除文件
- shutil.move(src, dst) 递归的去移动文件
- shutil.make_archive(base_name, format,...)
- 创建压缩包并返回文件路径,例如:zip、tar •base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, 如:www =>保存至当前路径 如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/ •format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar” •root_dir: 要压缩的文件夹路径(默认当前目录) •owner: 用户,默认当前用户 •group: 组,默认当前组 •logger: 用于记录日志,通常是logging.Logger对象 shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
- zipfile 压缩解压 tarfile 压缩解压 ZipFile TarFile
8、常用subprocess方法示例
#执行命令,返回命令执行状态 , 0 or 非0 >>> retcode = subprocess.call(["ls", "-l"])
#执行命令,如果命令结果为0,就正常返回,否则抛异常 >>> subprocess.check_call(["ls", "-l"]) 0
#接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果 >>> subprocess.getstatusoutput('ls /bin/ls') (0, '/bin/ls')
#接收字符串格式命令,并返回结果 >>> subprocess.getoutput('ls /bin/ls') '/bin/ls'
#执行命令,并返回结果,注意是返回结果,不是打印,下例结果返回给res >>> res=subprocess.check_output(['ls','-l']) >>> res b'total 0\ndrwxr-xr-x 12 alex staff 408 Nov 2 11:05 OldBoyCRM\n'
#上面那些方法,底层都是封装的subprocess.Popen poll() Check if child process has terminated. Returns returncode
wait() Wait for child process to terminate. Returns returncode attribute.
terminate() 杀掉所启动进程 communicate() 等待任务结束
stdin 标准输入
stdout 标准输出
stderr 标准错误
pid The process ID of the child process.
#例子 >>> p = subprocess.Popen("df -h|grep disk",stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True) >>> p.stdout.read() b'/dev/disk1 465Gi 64Gi 400Gi 14% 16901472 104938142 14% /\n'
调用subprocess.run(...)是推荐的常用方法,在大多数情况下能满足需求,但如果你可能需要进行一些复杂的与系统的交互的话,你还可以用subprocess.Popen(),语法如下
p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} \;",shell=True,stdout=subprocess.PIPE)
print(p.stdout.read())
可用参数:
- args:shell命令,可以是字符串或者序列类型(如:list,元组)
- bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
- stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
- preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
- close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。 所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
- shell:同上
- cwd:用于设置子进程的当前目录
- env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
- universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
- startupinfo与createionflags只在windows下有效 将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
9、终端输入的命令分为两种:
- 输入即可得到输出,如:ifconfig
- 输入进行某环境,依赖再输入,如:python
需要交互的命令示例
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) obj.stdin.write('print 1 \n ') obj.stdin.write('print 2 \n ') obj.stdin.write('print 3 \n ') obj.stdin.write('print 4 \n ') out_error_list = obj.communicate(timeout=10) print out_error_list
10、subprocess实现sudo 自动输入密码
import subprocess def mypass(): mypass = '123' #or get the password from anywhere return mypass echo = subprocess.Popen(['echo',mypass()], stdout=subprocess.PIPE, ) sudo = subprocess.Popen(['sudo','-S','iptables','-L'], stdin=echo.stdout, stdout=subprocess.PIPE, ) end_of_pipe = sudo.stdout print "Password ok \n Iptables Chains %s" % end_of_pipe.read()
11、logging 模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别
最简单用法
import logging
logging.warning("user [alex] attempted wrong password more than 3 times")
logging.critical("server is down")
#输出
WARNING:root:user [alex] attempted wrong password more than 3 times
CRITICAL:root:server is down
12、日志格式
- %(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 线程名。可能没有
- %(process)d 进程ID。可能没有
- %(message)s 用户输出的消息
13、日志写到文件里面
import logging
logging.basicConfig(filename='example.log',level=logging.INFO)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。
logging.basicConfig(filename='example.log',level=logging.INFO)
日志加时间
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
#输出
12/12/2010 11:46:36 AM is when this event was logged
14、同时把log打印在屏幕和文件日志里
- Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:
- logger提供了应用程序可以直接使用的接口;
- handler将(logger创建的)日志记录发送到合适的目的输出;
- filter提供了细度设备来决定输出哪条日志记录;
- formatter决定日志记录的最终输出格式。
15、正则表达式:
#!/usr/bin/env python3
import re
string = "192.168.2.100"
m = re.match("([0-9]{1,3}\.){3}\d{1,3}",string)
print(m.group())
运行结果:192.168.2.100
16、
#!/usr/bin/env python3
import re
m = re.split("[0-9]","hello1world2!")
print(m)
运行结果:['hello', 'world', '!']
17、data[index+1],data[index] = i,data[index+1] 对换。
18、
#!/usr/bin/env python3 data = [10,9,55,69,22,35,21,69,77] for j in range(1,len(data)): for i in range(len(data)-1): if data[i] > data[i+1]: tmp = data[i+1] data[i+1] = data[i] data[i] = tmp print(data)
运行结果:[9, 10, 21, 22, 35, 55, 69, 69, 77]
19、面向对象
#!/usr/bin/env python3 class Role(object): def __init__(self,name,role,weapon,life_value): self.name = name self.role = role self.weapon = weapon self.life_value = life_value def buy_weapon(self,weapon): print("%s is buying [%s]" %(self.name,weapon)) self.weapon = weapon #role 的实例 #把一个抽象的类变成一个具体的对象的过程叫实例化 p1 = Role("aaa",'Police',"B10",90) t1 = Role("bbb",'Terrorist',"B11",100) p1.buy_weapon("AK47") t1.buy_weapon("B51") print("P1:" ,p1.weapon) print("T1:" ,t1.weapon)
运行结果:aaa is buying [AK47] bbb is buying [B51] P1: AK47 T1: B51
20、面向对象 父类重写,继承和扩展。
Python 中文文档学习地址 : http://doc.iplaypy.com/