python常用模块
目录
python常用模块... 1
第1章 time与datetime模块... 1
1.1 格式化字符串... 2
1.2 时间转换:... 3
1.3 时间加减... 5
1.4 例子... 5
1.4.1 import time. 5
1.4.2 import datetime: 6
第2章 random模块... 7
2.1 随机验证码... 7
第3章 os模块... 8
3.1 os模块是与操作系统交互的一个接口... 8
3.2 Linux与MAC平台上... 9
3.3 os路径处理... 9
第4章 sys模块... 10
4.1 打印进度条:... 10
第5章 shutil模块... 11
5.1 shutil.copyfileobj(fsrc, fdst[, length]) 12
5.2 文件压缩打包... 13
第6章 shelve模块... 15
第7章 XML模块... 16
第8章 re模块... 18
8.1 什么是正则?... 18
8.2 示例:... 18
第9章 hashlib模块... 23
9.1 什么是hashlib. 23
9.2 hashlib特点... 23
9.3 示例:... 23
第10章 subprocess模块... 25
第11章 configparser模块... 26
第1章 time与datetime模块
在Python中,通常有这几种方式来表示时间:
时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
格式化的时间字符串(Format String)
结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
例子:
import time #--------------------------我们先以当前时间为准,让大家快速认识三种形式的时间 print(time.time()) # 时间戳:1487130156.419527 print(time.strftime("%Y-%m-%d %X")) #格式化的时间字符串:'2017-02-15 11:40:53' print(time.localtime()) #本地时区的struct_time print(time.gmtime()) #UTC时区的struct_time
1.1 格式化字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
%a Locale’s abbreviated weekday name. %A Locale’s full weekday name. %b Locale’s abbreviated month name. %B Locale’s full month name. %c Locale’s appropriate date and time representation. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %I Hour (12-hour clock) as a decimal number [01,12]. %j Day of the year as a decimal number [001,366]. %m Month as a decimal number [01,12]. %M Minute as a decimal number [00,59]. %p Locale’s equivalent of either AM or PM. (1) %S Second as a decimal number [00,61]. (2) %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3) %w Weekday as a decimal number [0(Sunday),6]. %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3) %x Locale’s appropriate date representation. %X Locale’s appropriate time representation. %y Year without century as a decimal number [00,99]. %Y Year with century as a decimal number. %z Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59]. %Z Time zone name (no characters if no time zone exists). %% A literal '%' character.
1.2 时间转换:
其中计算机认识的时间只能是'时间戳'格式,而程序员可处理的或者说人类能看懂的时间有: '格式化的时间字符串','结构化的时间' ,于是有了下图的转换关系
#--------------------------按图1转换时间
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# localtime([secs]) # 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。 time.localtime() time.localtime(1473525444.037215) # gmtime([secs]) 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。 # mktime(t) : 将一个struct_time转化为时间戳。 print(time.mktime(time.localtime()))#1473525749.0 # strftime(format[, t]) : 把一个代表时间的元组或者struct_time(如由time.localtime()和 # time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个 # 元素越界,ValueError的错误将会被抛出。 print(time.strftime("%Y-%m-%d %X", time.localtime()))#2016-09-11 00:49:56 # time.strptime(string[, format]) # 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。 print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')) #time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, # tm_wday=3, tm_yday=125, tm_isdst=-1) #在这个函数中,format默认为:"%a %b %d %H:%M:%S %Y"。
#--------------------------按图2转换时间
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# asctime([t]) : 把一个表示时间的元组或者struct_time表示为这种形式:'Sun Jun 20 23:21:05 1993'。 # 如果没有参数,将会将time.localtime()作为参数传入。 print(time.asctime())#Sun Sep 11 00:43:43 2016 # ctime([secs]) : 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为 # None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。 print(time.ctime()) # Sun Sep 11 00:46:38 2016 print(time.ctime(time.time())) # Sun Sep 11 00:46:38 2016
1.3 时间加减
#时间加减
import datetime # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925 #print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19 # print(datetime.datetime.now() ) # print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天 # print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天 # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时 # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分 # c_time = datetime.datetime.now() # print(c_time.replace(minute=3,hour=2)) #时间替换
datetime模块
1.4 例子
1.4.1 import time
import time
时间分为三种形式
1、时间戳
print(time.time()) start_time=time.time() time.sleep(3) stop_time=time.time() print(stop_time-start_time)
2、格式化的字符串
print(time.strftime('%Y-%m-%d %H:%M:%S %p')) print(time.strftime('%Y-%m-%d %X %p'))
3、struct_time对象
print(time.localtime()) # 上海:东八区 print(time.localtime().tm_year) print(time.localtime().tm_mday) print(time.gmtime()) # UTC时区
了解的知识
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
print(time.localtime(1111111111).tm_hour) print(time.gmtime(1111111111).tm_hour) print(time.mktime(time.localtime())) print(time.strftime('%Y/%m/%d',time.localtime())) print(time.strptime('2017/04/08','%Y/%m/%d')) print(time.asctime(time.localtime())) print(time.ctime(12312312321))
1.4.2 import datetime:
import datetime print(datetime.datetime.now()) print(datetime.datetime.now() + datetime.timedelta(days=3)) print(datetime.datetime.now() + datetime.timedelta(days=-3)) print(datetime.datetime.now() + datetime.timedelta(hours=3)) print(datetime.datetime.now() + datetime.timedelta(seconds=111)) current_time=datetime.datetime.now() print(current_time.replace(year=1977)) print(datetime.date.fromtimestamp(1111111111))
第2章 random模块
import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数 print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 item=[1,3,5,7,9] random.shuffle(item) #打乱item的顺序,相当于"洗牌" print(item)
2.1 随机验证码
i
mport random def make_code(n=5): res='' for i in range(n): s1=str(random.randint(0,9)) s2=chr(random.randint(65,90)) res+=random.choice([s1,s2]) return res print(make_code(10))
第3章 os模块
3.1 os模块是与操作系统交互的一个接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的大小
3.2 Linux与MAC平台上
在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
>>> os.path.normcase('c:/windows\\system32\\')
'c:\\windows\\system32\\'
规范化路径,如..和/
>>> os.path.normpath('c://windows\\System32\\../Temp/')
'c:\\windows\\Temp'
>>> a='/Users/jieli/test1/\\\a1/\\\\aa.py/../..'
>>> print(os.path.normpath(a))
/Users/jieli/test1
3.3 os路径处理
os路径处理
#方式一:推荐使用
import os #具体应用 import os,sys possible_topdir = os.path.normpath(os.path.join( os.path.abspath(__file__), os.pardir, #上一级 os.pardir, os.pardir )) sys.path.insert(0,possible_topdir)
#方式二:不推荐使用
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
第4章 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 返回操作系统平台名称
4.1 打印进度条:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
print('[ ]') print('[## ]') print('[### ]') print('[#### ]') print('[##### ]') print('[%-50s]' %'#') print('[%-50s]' %'##') print('[%-50s]' %'###') 第一个%是取消第二个%号的特殊意义的 num=30 print('%s%%' %num) width=30 print(('[%%-%ds]' %width) %'#') print(('[%%-%ds]' %width) %'##') print(('[%%-%ds]' %width) %'###') def progress(percent,width=50): if percent > 1: percent=1 show_str=('[%%-%ds]' %width) %(int(width*percent) * '#') print('\r%s %d%%' %(show_str,int(100*percent)),end='') import time recv_size=0 total_size=8097 while recv_size < total_size: time.sleep(0.1) recv_size+=8096 percent=recv_size / total_size progress(percent)
第5章 shutil模块
高级的 文件、文件夹、压缩包 处理模块
5.1 shutil.copyfileobj(fsrc, fdst[, length])
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
将文件内容拷贝到另一个文件中 1 import shutil 2 3 shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) shutil.copyfile(src, dst) 拷贝文件 1 shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在 shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变 1 shutil.copymode('f1.log', 'f2.log') #目标文件必须存在 shutil.copystat(src, dst) 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags 1 shutil.copystat('f1.log', 'f2.log') #目标文件必须存在 shutil.copy(src, dst) 拷贝文件和权限 1 import shutil 2 3 shutil.copy('f1.log', 'f2.log') shutil.copy2(src, dst) 拷贝文件和状态信息 1 import shutil 2 3 shutil.copy2('f1.log', 'f2.log') shutil.ignore_patterns(*patterns) shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件夹 1 import shutil 2 3 shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除 拷贝软连接 shutil.rmtree(path[, ignore_errors[, onerror]]) 递归的去删除文件 1 import shutil 2 3 shutil.rmtree('folder1') shutil.move(src, dst) 递归的去移动文件,它类似mv命令,其实就是重命名。 1 import shutil 2 3 shutil.move('folder1', 'folder3') shutil.make_archive(base_name, format,...) 创建压缩包并返回文件路径,例如:zip、tar 创建压缩包并返回文件路径,例如:zip、tar base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, 如 data_bak =>保存至当前路径 如:/tmp/data_bak =>保存至/tmp/ format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar” root_dir: 要压缩的文件夹路径(默认当前目录) owner: 用户,默认当前用户 group: 组,默认当前组 logger: 用于记录日志,通常是logging.Logger对象
5.2 文件压缩打包
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#将 /data 下的文件打包放置当前程序目录 import shutil ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data') #将 /data下的文件打包放置 /tmp/目录 import shutil ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data') shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细: import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall(path='.') z.close() zipfile压缩解压缩 import tarfile # 压缩 >>> t=tarfile.open('/tmp/egon.tar','w') >>> t.add('/test1/a.py',arcname='a.bak') >>> t.add('/test1/b.py',arcname='b.bak') >>> t.close() # 解压 >>> t=tarfile.open('/tmp/egon.tar','r') >>> t.extractall('/egon') >>> t.close() tarfile压缩解压缩
第6章 shelve模块
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import shelve info1={'age':18,'height':180,'weight':80} info2={'age':73,'height':150,'weight':80} d=shelve.open('db.shv') d['egon']=info1 d['alex']=info2 d.close() d=shelve.open('db.shv') # print(d['egon']) # print(d['alex']) d.close() d=shelve.open('db.shv',writeback=True) d['alex']['age']=10000 # print(d['alex']) d.close() d=shelve.open('db.shv',writeback=True) print(d['alex']) d.close() import json l={'a':1,'b':2,'c':3} json.dump(l,open('a.json','wt',encoding='utf-8'))
第7章 XML模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#==========================================>查 import xml.etree.ElementTree as ET # tree=ET.parse('a.xml') root=tree.getroot() 三种查找节点的方式 res=root.iter('rank') # 会在整个树中进行查找,而且是查找到所有 for item in res: # print(item) print('='*50) print(item.tag) # 标签名 print(item.attrib) #属性 print(item.text) #文本内容 res=root.find('country') # 只能在当前元素的下一级开始查找。并且只找到一个就结束 print(res.tag) print(res.attrib) print(res.text) nh=res.find('neighbor') print(nh.attrib) cy=root.findall('country') # 只能在当前元素的下一级开始查找, print([item.attrib for item in cy]) ==========================================>改 import xml.etree.ElementTree as ET tree=ET.parse('a.xml') root=tree.getroot() for year in root.iter('year'): year.text=str(int(year.text) + 10) year.attrib={'updated':'yes'} tree.write('b.xml') tree.write('a.xml') #==========================================>增 import xml.etree.ElementTree as ET tree=ET.parse('a.xml') root=tree.getroot() for country in root.iter('country'): print(country) year=country.find('year') print(year) if int(year.text) > 2020: print(country.attrib) ele=ET.Element('egon') ele.attrib={'nb':'yes'} ele.text='非常帅' country.append(ele) country.remove(year) tree.write('b.xml')
第8章 re模块
8.1 什么是正则?
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行
8.2 示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re print(re.findall('\w','ab 12\+- *&_')) \w print(re.findall('\W','ab 12\+- *&_')) print(re.findall('\s','ab \r1\n2\t\+- *&_')) print(re.findall('\S','ab \r1\n2\t\+- *&_')) print(re.findall('\d','ab \r1\n2\t\+- *&_')) \d print(re.findall('\D','ab \r1\n2\t\+- *&_')) print(re.findall('\w_sb','egon alex_sb123123wxx_sb,lxx_sb')) \w_sb print(re.findall('\Aalex','abcalex is salexb')) print(re.findall('\Aalex','alex is salexb')) print(re.findall('^alex','alex is salexb')) print(re.findall('sb\Z','alexsb is sbalexbsb')) print(re.findall('sb$','alexsb is sbalexbsb')) sb print(re.findall('^ebn$','ebn1')) ebn print(re.findall('a\nc','a\nc a\tc a1c')) 重复匹配: . ? * + {m,n} .* .*? 1、.:代表除了换行符外的任意一个字符 print(re.findall('a.c','abc a1c aAc aaaaaca\nc')) a.c print(re.findall('a.c','abc a1c aAc aaaaaca\nc',re.DOTALL)) 2、?:代表左边那一个字符重复0次或1次 print(re.findall('ab?','a ab abb abbb abbbb abbbb')) ab? 3、*:代表左边那一个字符出现0次或无穷次 print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) ab* 4、+ :代表左边那一个字符出现1次或无穷次 print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) ab+ 5、{m,n}:代表左边那一个字符出现m次到n次 print(re.findall('ab?','a ab abb abbb abbbb abbbb')) print(re.findall('ab{0,1}','a ab abb abbb abbbb abbbb')) print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) print(re.findall('ab{0,}','a ab abb abbb abbbb abbbb a1bbbbbbb')) print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) print(re.findall('ab{1,}','a ab abb abbb abbbb abbbb a1bbbbbbb')) print(re.findall('ab{1,3}','a ab abb abbb abbbb abbbb a1bbbbbbb')) 6、.*:匹配任意长度,任意的字符=====》贪婪匹配 print(re.findall('a.*c','ac a123c aaaac a *123)()c asdfasfdsadf')) a.*c 7、.*?:非贪婪匹配 print(re.findall('a.*?c','a123c456c')) ():分组 print(re.findall('(alex)_sb','alex_sb asdfsafdafdaalex_sb')) (alex)_sb print(re.findall( 'href="(.*?)"', '<li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>') ) <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li> href=".*?" []:匹配一个指定范围内的字符(这一个字符来自于括号内定义的) print(re.findall('a[0-9][0-9]c','a1c a+c a2c a9c a11c a-c acc aAc')) 当-需要被当中普通符号匹配时,只能放到[]的最左边或最 右边 print(re.findall('a[-+*]c','a1c a+c a2c a9c a*c a11c a-c acc aAc')) print(re.findall('a[a-zA-Z]c','a1c a+c a2c a9c a*c a11c a-c acc aAc')) []内的^代表取反的意思 print(re.findall('a[^a-zA-Z]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc')) print(re.findall('a[^0-9]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc')) print(re.findall('([a-z]+)_sb','egon alex_sb123123wxxxxxxxxxxxxx_sb,lxx_sb')) [a-z]+_sb | :或者 print(re.findall('compan(ies|y)','Too many companies have gone bankrupt, and the next one is my company')) (?:):代表取匹配成功的所有内容,而不仅仅只是括号内的内容 print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company')) print(re.findall('alex|sb','alex sb sadfsadfasdfegon alex sb egon')) re模块的其他方法: print(re.findall('alex|sb','123123 alex sb sadfsadfasdfegon alex sb egon')) print(re.search('alex|sb','123213 alex sb sadfsadfasdfegon alex sb egon').group()) print(re.search('^alex','123213 alex sb sadfsadfasdfegon alex sb egon')) print(re.search('^alex','alex sb sadfsadfasdfegon alex sb egon').group()) print(re.match('alex','alex sb sadfsadfasdfegon alex sb egon').group()) print(re.match('alex','123213 alex sb sadfsadfasdfegon alex sb egon')) info='a:b:c:d' print(info.split(':')) print(re.split(':',info)) info=r'get :a.txt\3333/rwx' print(re.split('[ :\\\/]',info)) print('egon is beutifull egon'.replace('egon','EGON',1)) print(re.sub('(.*?)(egon)(.*?)(egon)(.*?)',r'\1\2\3EGON\5','123 egon is beutifull egon 123')) (123 )(egon)( is beutifull )(egon)( 123) \1\2\3EGON\5 print(re.sub('(lqz)(.*?)(SB)',r'\3\2\1',r'lqz is SB')) print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)',r'\5\2\3\4\1',r'lqzzzz123+ is SB')) (lqzzzz)(123+ )(is)( )(SB) pattern=re.compile('alex') print(pattern.findall('alex is alex alex')) print(pattern.findall('alexasdfsadfsadfasdfasdfasfd is alex alex'))
第9章 hashlib模块
9.1 什么是hashlib
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值
9.2 hashlib特点
1、只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
2、不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
3、只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
9.3 示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import hashlib m = hashlib.md5() m.update('hello'.encode('utf-8')) m.update('work'.encode('utf-8')) print(m.hexdigest()) 读文件 import hashlib m=hashlib.md5() with open(r'E:\python_file\2018-4-10\hash.py','rb')as f: for line in f: m.update(line) hv=m.hexdigest() print(hv) 密码加盐 import hashlib pwd='alex3714' m=hashlib.md5() m.update('一行白鹭上青天') ###不加反解编码会报错 m.update(pwd.encode('utf-8')) m.update('填'.encode('utf-8')) print(m.hexdigest()) import hashlib m=hashlib.md5() m.update('helloworld'.encode('utf-8')) print(m.hexdigest()) m=hashlib.sha3_512() m.update('helloworld'.encode('utf-8')) print(m.hexdigest()) m=hashlib.sha1() m.update('helloworld'.encode('utf-8')) print(m.hexdigest()) import hmac m=hmac.new('阿萨德啊'.encode('utf-8')) m.update('aaa1a23'.encode('utf-8')) print(m.hexdigest())
第10章 subprocess模块
示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import subprocess import time time.sleep(500) dos命令 tasklist | findstr python taskkill /? D:\code>tasklist | findstr python python.exe 12360 Console 1 11,024 K D:\code>taskkill /F /PID 12360 linux系统(了解) ps aux | grep python kill -9 PID import os while True: cmd=input('>>>: ').strip() if not cmd:continue # print('%s run' %cmd) res=os.system(cmd) network.send(res) import os res=os.system('dixCVr') print('运行结果:',res) import subprocess obj=subprocess.Popen('dir', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # print(obj) res1=obj.stdout.read() print('正确结果1111: ',res1) res2=obj.stdout.read() print('正确结果2222: ',res2) #只能取一次,取走了就没有了 # res2=obj.stderr.read() # print('错误结果:',res2.decode('gbk'))
第11章 configparser模块
示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import configparser config=configparser.ConfigParser() config.read('my.ini') # secs=config.sections() # print(secs) # print(config.options('egon')) # age=config.get('egon','age')` # age=config.getint('egon','age') # print(age,type(age)) # salary=config.getfloat('egon','salary') # print(salary,type(salary)) b=config.getboolean('egon','is_beatifull') print(b,type(b))