我曾临渊而行,也曾踏渊而寻;我无惧六欲,深得七情;我必寻得七彩,乘云而疾。
os模块补充
print(os.path.normcase('c:/Windows\\system32\\')) # 纠正符号
print(os.path.normpath('c://windows\\System32\\..Temp/')) # 纠正格式
print(os.path.normpath(os.path.join(os.path.abspath(__file__),'..','..')) # 直接返回上上级菜单,自动纠正
re模块
1、什么是正则
正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串
正则就是用来去一个大的字符串中匹配出符合规则的子字符串
2、为什么要用正则
1、用户注册
2、爬虫程序
3、如何用正则
\w 字母和数字及下划线
\W 除了字母和数字及下划线
\s 匹配任意非空字符
\S 匹配任意非空字符
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符的末尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[...] 用来表示一组字符,单独列出:[amk]匹配'a','m'或'k'
[^...] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符
* 匹配0个或多个的表达式
+ 匹配1个或多个的表达式
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪模式
{n} 精确匹配n个前面表达式
{n,m} 匹配n到m次由前面的正则表达式定义的片段,贪婪模式
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组,会打印输出该组内的字符
A.*B 贪婪匹配,会匹配第一个A-最后一个B内的所有字符
A.*?B 非贪婪匹配,只会匹配第一个A-第一个B内的字符
A(?:B|C) 会匹配AB或者AC
A\\\\B、A\\\B 会匹配A\B
serach()的用法,会匹配出一个地址,可以使用group()打印输出search匹配的值
mathch()的用法,会匹配出一个地址,但只会匹配出第一个该值
re.split('[-+*/]',' ')会按照-+*/来分割字符串
re.sub('[a-z]+xx','cyd',' ')会匹配并替换[a-z]+xx格式的字符为cyd
pattern = re.compile('alex') # 设置为通用的正则表达式
print(pattern.findall('alex is SB, alex is Big SB))
print(pattern.search('alex is SB, alex is Big SB))
sys 模块
sys.path显示系统路径
sys.argv 用来接收python解释器执行py文件后跟的参数
例如:python cp.py argv1 argv2 arg3
sys.argv = ['cp.py', 'argv1', 'argv2', 'argv3']
可以用于拷贝文件时,直接通过该方式输入拷贝源文件和拷贝到的文件,不需要用input让用户输入
import sys # print(sys.argv) # src_file=input('请输入源文件路径:') src_file=sys.argv[1] # dst_file=input('请输入目标文件路径:') dst_file=sys.argv[2] with open(src_file,'rb') as read_f,\ open(dst_file,'wb') as write_f: for line in read_f: write_f.write(line)
subprocess模块
主要用于创建一个副进程
obj = subprocess.Popen(
'tasklist', # 打开进程
shell = True, # 打开shell窗口
stdout = subprocess.PIPE, # 给父进程和子进程之间的正确信息创建一个管道
stderr = subprocess.PIPE,# 给父进程和子进程之间的错误信息创建一个管道
print(obj) stdout_res=obj.stdout.read() # 读出父进程与子进程之间的正确信息 print(stdout_res.decode('gbk')) # 因为sys是与操作系统直接接触,所以是用'gbk'编码,因此得用'gbk'解码 print(stdout_res)
通道之间的信息读一次就没了
stderr_res1=obj.stderr.read() stderr_res2=obj.stderr.read() stderr_res3=obj.stderr.read() # print(stderr_res1.decode('gbk')) print(stderr_res1) print(stderr_res2) print(stderr_res3)
两个小程序
1、设置一段验证码
import random # 1X3Y3ZX def make_code(size=7): res = '' for i in range(size): # 循环一次则得到一个随机字符(字母/数字) s = chr(random.randint(65, 90)) num = str(random.randint(0, 9)) res += random.choice([s, num]) return res res=make_code() print(res)
2、打印进度条
''' [# ] [## ] [### ] [#### ] [##### ] ''' # print('[%-50s]' %'#') # print('[%-50s]' %'##') # print('[%-50s]' %'###') # print('[%-50s]' %'####') # print('[%-50s]' %'#####') # print('%s%%' %50) # 1、控制打印进度条的宽度 # res='[%%-%ds]' %50 # print(res %'#') # print(res %'##') # print(res %'###') # print(res %'####') # print(res %'#####') #2、不换行+跳回行首打印 # import time # print(('\r[%%-%ds]' %50) %'#',end='') # time.sleep(0.5) # print(('\r[%%-%ds]' %50) %'##',end='') # time.sleep(0.5) # print(('\r[%%-%ds]' %50) %'###',end='') # time.sleep(0.5) # print(('\r[%%-%ds]' %50) %'####',end='') # time.sleep(0.5) # print(('\r[%%-%ds]' %50) %'#####',end='') import time def make_progress(percent,width=50): if percent > 1:percent=1 show_str=('[%%-%ds]' % width) % (int(percent * width) * '#') print('\r%s %s%%' %(show_str,int(percent * 100)),end='') total_size=1025 recv_size=0 while recv_size < total_size: time.sleep(0.1) # 模拟经过了0.5的网络延迟下载了1024个字节 recv_size+=1024 # 调用打印进度条的功能去打印进度条 percent=recv_size / total_size make_progress(percent)