Python自动化开发课堂笔记【Day06】 - Python基础(模块)
正则模块
常用正则表达式列表(盗图一张:-P)
1 import re 2 3 print(re.findall('\w','abc123d_ef * | - =')) 4 print(re.findall('\W','abc123d_ef * | - =')) 5 print(re.findall('\s','abc1\n23\td_ef * | - =')) 6 print(re.findall('\S','abc1\n23\td_ef * | - =')) 7 print(re.findall('\d','abc1\n23\td_ef * | - =')) 8 print(re.findall('\D','abc1\n23\td_ef * | - =')) 9 print(re.findall('^a','abc1\n23\tad_efa * | - =')) 10 print(re.findall('a$','abc1\n23\tad_efa * | - =')) 11 print(re.findall('\n','abc1\n\n23\tad_efa * | - =')) 12 print(re.findall('\t','abc1\n\n23\tad_efa * | - =')) 13 print(re.findall('a.c','abc1\nn2a\nc3\tad_efa * | - =',re.S)) 14 print(re.findall('a[^-.\n]c','a.c1\nn2a\nc3\tad_efa * | - =')) 15 print(re.findall('ab*','a')) 16 print(re.findall('ab*','abbbbbbbbbbbbbbbbbbbbbbbbb')) 17 print(re.findall('ab+','abbbbb')) 18 print(re.findall('ab?','a')) 19 print(re.findall('ab?','ab')) 20 print(re.findall('ab?','abb')) 21 print(re.findall('ab?c','abbc')) #ac abc 22 print(re.findall('ab?c','ac')) #ac abc 23 print(re.findall('ab?c','abc')) #ac abc 24 print(re.findall('ab{2}','123123123abbbbbbbb')) #abb 25 print(re.findall('ab{2}c','123123123abbbbbbbbc')) #abb 26 print(re.findall('ab{1,}c','123123123abbbbbbbbc')) #abc abbbbbbbbbbbbbc 27 print(re.findall('company|companies','all companies will be done,my company is already done')) 28 print(re.findall('compan(y|ies)','all companies will be done,my company is already done')) #['ies', 'y'] 29 print(re.findall('compan(?:y|ies)','all companies will be done,my company is already done')) #['ies', 'y'] 30 print(re.findall('al(?:e)x','alex make love')) # 将目标字符串全部匹配出来 31 print(re.findall(r'a\\c','a\c')) or re.findall('a\\\\c','a\c') 32 print(re.findall('a.*b','a123b456789b')) #贪婪匹配 33 print(re.findall('a.*?b','a123b456789b')) #非贪婪匹配
===========================================分割线===========================================
1 print(re.search('e','alex make love')) # 只输出第一个匹配到的e 2 print(re.search('^e','alex make love')) # 匹配开头为e的 3 print(re.search('e','alex make love')) 4 print(re.match('e','alex make love')) 5 print(re.match('a','alex make love').group()) # 输出匹配的全部内容 6 print(re.search('al(e)x\smak(e)','alex make love').group()) # alex make 7 print(re.findall('al(?:e)x\smak(?:e)','alex make love')) # 功能同上 8 print(re.split('[ab]','abcd')) # ['','','cd] 9 print(re.sub('^a','A','alex make love')) 10 print(re.sub('a','A','alex make love')) 11 print(re.sub('^(\w+)(\s)(\w+)(\s)(\w+)',r'\5\2\3\4\1','alex make love'))# love make alex 12 print(re.sub('^(\w+)(\s+)(\w+)(\s+)(\w+)',r'\5','alex make love')) 13 print(re.sub('^(\w+)(\W+)(\w+)(\W+)(\w+)',r'\5\2\3\4\1','alex " \ + = make ----/== love')) 14 print(re.search('companies|company','my company is already done,all companies will be done').group())# conpany 15 print(re.findall(r'\-?\d+\.?\d*',"1-12*(60+(-40.35/5)-(-4*3))")) # 匹配出所有的数字(整数和小数) 16 print(re.findall(r'\-?\d+\.\d*',"1-2*(60+(-40.35/5.3+1.2)-(-4*3))")) # 匹配出所有的小数 17 print(re.findall(r'\-?\d+\.\d+|(\-?\d+)',"1-2*(60+(-40.35/5.3+1.2)-(-4*3))")) # 匹配出所有的整数
时间模块
#时间戳 # print(time.time()) # 从UNIX元年(1970)计算的秒数,给机器用的 #结构化的时间 # print(time.localtime()) # 对象的形式的数据 # print(time.localtime().tm_year) # 加后缀取本地时间的年份 # print(time.gmtime()) # UTC时间,同样可加后缀显示年月日时分秒 #格式化的字符串 # print(time.strftime('%Y-%m-%d %H:%M:%S')) # 注意:区分大小写 # print(time.strftime('%Y-%m-%d %X')) # X代表时分秒相当于%H:%M:%S # print(time.localtime(13211123)) # 将localtime转化为结构化的时间 # print(time.localtime(time.time())) # print(time.mktime(time.localtime())) # 把当前的时间转化为时间戳 # print(time.strftime('%Y %X',time.localtime())) # 将格式化的时间转化为格式化的字符串 # print(time.strptime('2017-06-04 11:59:59','%Y-%m-%d %X')) # 把格式化的字符串转化为结构化的时间 # print(time.asctime()) # Linux 显示时间的格式 # print(time.ctime(123123132)) # 将时间戳转化为Linux格式显示时间 # print(time.asctime(time.localtime()))
Random模块
import random print(random.random()) # 产生0-1之间的小数 print(random.random()*10) # 产生1-10之间的整数 print(random.randint(1,3)) # 产生1-3之间的整数 print(random.randrange(1,3)) # 产生大于等于1且小于3之间的整数 print(random.choice('a','b',['c','d'],'e')) # 任意1个元素 print(random.sample('a','b',['c','d'],'e')) # 任意2个元素组成的列表 print(random.uniform(1,3)) # 大于1小于3的小数 #洗牌操作,打乱列表顺序重新排列 item=[1,3,5,7,9] random.shuffle(item) print(item) #生成验证码 import random def v_code(n=5): res='' for i in range(n): num=random.randint(0,9) s=chr(random.randint(65,90)) ss = chr(random.randint(97,122)) add=random.choice([num,s,ss]) res+=str(add) return res print(v_code(6))
OS模块
import os print(os.path.abspath('a/b/c.txt')) #E:\wupeiqi\s17\day06\a\b\c.txt print(os.path.abspath('/a/b/c.txt')) #E:\a\b\c.txt print(os.path.split('E:\\a\\c.txt')) #切割文件所在文件夹路径和文件名 print(os.path.dirname('E:\\a\\c.txt')) #文件所在路径 print(os.path.dirname('E:\\a')) print(os.path.basename('E:\\a\\a.txt')) #文件名 print(os.path.exists('E:\\a')) #判断路径是否存在 False print(os.path.exists('E:\wupeiqi\s17\day06')) # True print(os.path.isabs('E:\\day06')) #判断是否是绝对路径True,不会判断该路径是否存在 print(os.path.isabs('day06'))#False print(os.path.getsize(r'E:\wupeiqi\s17\day06\test.py')) #查看文件大小,单位是字节byte print(os.path.join('a','E:\\b','c.txt')) # 找到第一个绝对路径开始往后拼接路径,如果没有根目录就从头开始往后拼接 print(os.path.join('a','/b','c.txt')) #/b/c.txt #Linux的路径拼接方式 print(os.path.normcase('c:/wIndows\\system32\\')) #只在windows中有效c:\wIndows\system32\ print(os.path.normpath('c://windows\\System32\\../Temp/')) #拼接为绝对路径,将路径中的..转换为上一级目录 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #当前文件的主目录文件打印出来 print(os.path.normpath(os.path.join(__file__, os.pardir, os.pardir))) #效果同上
sys模块
import sys print(sys.argv[i]) #去脚本执行后边跟着的某个参数 #打印进度条 import sys, time for i in range(50): sys.stdout.write('%s\r' % ('#'*i)) #'\r'表示跳会当前行首重新覆盖打印该行。 sys.stdout.flush() # 把打印结果刷出来 time.sleep(0.1) # 时间控制
shutil模块
import shutil shutil.copyfileobj(open('ALesson06.py','r'),open('new_copy','w')) shutil.copyfile('f1.log','f2.log') #目标文件无需存在,没有目标文件就会自行创建,存在即被覆盖内容 shutil.copymode('f1.log','f2.log') #仅拷贝权限。内容,组,用户均不变 shutil.copystat('f1.log','f2.log') #仅拷贝状态的信息,包括:mode,bits,atime,mtime,flags shutil.copy2('f1.log','f2.log') #拷贝文件和状态信息 shutil.copytree('folder1','folder2',ignore=shutil.ignore_patterns('*.pyc','tmp*')) # 目标目录不能存在,注意f2目录父及目录要有可写权限,ignore是排除操作 # 拷贝软连接 shutil.copytree('folder1','folder2',symlinks=True, ignore=shutil.ignore_patterns('*.pyc','tmp*')) # 通常的拷贝都把软连接拷贝成硬连接,即对待软连接来说,创建新的文件 shutil.rmtree('folder1') #递归的删除目录 shutil.move('folder1','folder2') #递归的移动文件,它类似mv命令,其实就是重命名 shutil.make_archive('data_bak','gztar',root_dir='/data') #将/data下的文件打包放置当前程序目录 shutil.make_archive('tmp/data_bak','gztar',root_dir='/data') #将/data下的文件打包放置到/tmp目录
# tarfile压缩解压缩 import tarfile # 解压 t = tarfile.open('/tmp/albert.tar','r') t.extractall('/albert') t.close() # 压缩 t = tarfile.open('/tmp/albert.tar','w') t.add('/test1/a.py',arcname='a.bak') #arcname作用在于解压后给之前的文件起了个别名 t.close()
json模块
x = "[null,true,false,1]" eval(x) #错误,不识别null res = json.loads(x) print(res) #[None, True, False, 1] dic={'name':'aaa','age':111} print(json.dumps(dic)) #将python中的字典类型转化为json能识别的字符串 with open('a.json','w') as f: #写数据,序列化的过程 f.write(json.dumps(dic)) with open('a.json','r') as f: #读数据,反序列化的过程 json.loads(f.read()) print(dic['name']) #json操作精简版 json.dump(dic,open('b.json','w')) print(json.load(open('b.json','r')))
pickle模块
#序列化python任意的对象 x = "[null,true,false,1]" pickle.loads(x) #pickle值支持python类型,此处也报错 dic={'name':'aaa','age':111} print(pickle.dumps(dic)) #b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01KoX\x04\x00\x00\x00nameq\x02X\x03\x00\x00\x00aaaq\x03u.' #pickle输出的为bytes类型 with open('a.pkl','wb') as f: f.write(pickle.dumps(dic)) with open('a.pkl','rb') as f: res = pickle.loads(f.read()) #pickle操作精简版 pickle.dump(dic,open('b.json','wb')) print(pickle.load(open('b.json','rb'))) #序列化函数,json无法序列化 def func(): print('from func') print(pickle.dumps(func)) #b'\x80\x03c__main__\nfunc\nq\x00.' pickle.dump(func,open('func.pkl','wb')) res = pickle.load(open('func.pkl','rb')) res() #可以执行
shelve模块
import shelve f = shelve.open(r'shelve.txt') f['p1'] = {'name':'aaa' , 'age': 111} print(f['p1']) f.close()
xml模块
import xml.etree.ElementTree as ET tree = ET.parse("a") root = tree.getroot() print(root.tag) print(root.iter('year')) #全文搜索,不考虑层级结构 for i in root.iter('year'): print(i.tag,i.text,i.attrib) print(root.find('year')) #查找子节点 print(root.find('country').attrib) #查找子节点下面的一个 print(root.findall('country')) for country in root: #遍历各个country子节点 print('--->', country.attrib['name']) for item in country: #打印子节点下面的内容 print(item.tag,item.text,item.attrib) for year in root.iter('year'): print(year.tag,year.text,year.attrib) #修改 for year in root.iter('year'): year.text = str(int(year.text)+1) year.set('update','yes') tree.write('a') #删除 for country in root.iter('country'): print(country.find('year')) res = country.find('year') if int(res.text) > 2010: country.remove(res) tree.write('a') #添加 for country in root.iter('country'): for year in country.findall('year'): if int(year.text) > 2000: year2 = ET.Element('year2') year2.text = 'New Year' year2.attrib={'update':'yes'} country.append(year2) #添加子节点 tree.write('a')
hashlib模块
import hashlib #进行文本字符串校验 hmd5 = hashlib.md5() hmd5.update('abcdefghigk'.encode('utf-8')) print(hmd5.hexdigest()) #eb78bf0ff2049d407b4c5e627b75425a相同字符串的hash值是不变的 #如何校验文件 with open('a','rb') as f: for line in f: hmd5.update(line) md5_res = hmd5.hexdigest() print(md5_res)#740bfdb0173ca162711f2cceca382665 hmd5.update('Hello'.encode('utf-8')) hmd5.update('World'.encode('utf-8')) print(hmd5.hexdigest())#68e109f0f40ca72a15e05cc22786f8e6 hmd5.update('HelloWorld'.encode('utf-8')) print(hmd5.hexdigest())#68e109f0f40ca72a15e05cc22786f8e6 hsha = hashlib.sha256() hsha.update('abcdefghigk'.encode('utf-8')) print(hsha.hexdigest()) #密码加盐 import hmac h = hmac.new('albert'.encode('utf-8')) h.upate('hello'.encode('utf-8')) print(h.hexdigest())
subprocess模块
import subprocess res = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE) print(res) print(res.stdout.read().decode('gbk')) #管道只能取一次内容 res = subprocess.Popen('direrr',shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) print('--->',res.stdout.read()) print('--->',res.stderr.read().decode('gbk')) # ls | grep txt$ res1 = subprocess.Popen(r'dir E:\a\b\c ',shell=True,stdout=subprocess.PIPE) res2 = subprocess.Popen(r'findstr txt*', shell=True, stdin=res1.stdout, stderr=subprocess.PIPE, stdout=subprocess.PIPE) print(res2.stdout.read().decode('gbk'))
logging模块
import logging logging.basicConfig(filename='access.log', format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10) logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical')
configparser模块
import configparser conf = configparser.ConfigParser() conf.read('conf.ini') print(conf.sections())#查看所有标题 print(conf.options('section1'))#查看单个标题下的所有key print(conf.items('section1'))#查看单个标题下的所有key-value print(conf.get('section1','user'))#查看section1下user的值(字符串) print(conf.getint('section1','age'))#查看section1下age的值(整型) print(conf.getboolean('section1','enable'))查看section1下enable的值(布尔型) conf.remove_section('section1')#删除标题下所有内容 conf.remove_option('section1','k1')#删除标题下某个键值 print(conf.has_section('section1'))#是否存在该标题 print(conf.has_option('section1',''))#是否存在option conf.add_section('section3')#添加新标题 conf.set('section3','name','albert')#在新标题下添加新option conf.set('section3','age','18') conf.write(open('conf.ini','w'))#保存到文件
软件开发规范示例
Package(该文件目录许加入环境变量中) |___bin(可执行文件) |___start.py |___conf(配置文件) |___settings.py |___logs(日志文件) |___lib(库文件) |___db(数据库文件) |___core(主文件) | |___main.py |___readme