python内置模块之(os,sys,hashlib,re)
os模块
1 os.path.dirname() # 获取文件的上一层目录名,其实就是os.path.split(path)的第一个元素 2 os.path.abspath() # 获取文件的绝对路径,包括文件名 3 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 4 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 5 os.curdir 返回当前目录: ('.') 6 os.pardir 获取当前目录的父目录字符串名:('..') 7 os.makedirs('dir1/dir2') 可生成多层递归目录 8 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 9 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 10 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 11 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 12 os.remove() 删除一个文件 13 os.rename("oldname","new") 重命名文件/目录 14 os.stat('path/filename') 获取文件/目录信息 15 os.sep 操作系统特定的路径分隔符,win下为"\",Linux下为"/" 16 os.linesep 当前平台使用的行终止符,win下为" ",Linux下为" " 17 os.pathsep 用于分割文件路径的字符串 18 os.name 字符串指示当前使用平台。win->'nt'; Linux->'posix' 19 os.system("bash command") 运行shell命令,直接显示 20 os.environ 获取系统环境变量 21 os.path.split(path) 将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所指向的文件或者目录的最后修改时间
sys模块实现进度条
1 import sys 2 import time 3 4 5 def view_bar(num, total): 6 rate = float(num) / float(total) 7 rate_num = int(rate * 100) 8 r = ' %d%%' % (rate_num, ) 9 sys.stdout.write(r) 10 sys.stdout.flush() 11 12 13 if __name__ == '__main__': 14 for i in range(0, 100): 15 time.sleep(0.1) 16 view_bar(i, 100)
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.stdin # 输入相关 8 sys.stdout # 输出相关 9 sys.stderror # 错误相关
hashlib模块
1 import hashlib 2 obj = hashlib.md5() # 如果需要加盐,写法是:obj = hashlib.md5(bytes('asd23', encoding='utf-8')) 3 obj.update(bytes('123', encoding='utf-8')) #3.0版本python写法,2.0版本写法是:obj.update('123') 4 result = obj.hexdigest() 5 print(result)
模块中的特殊变量
1 __file__ # 获取当前文件的完整路径加文件名 2 __doc__ # 获取当前文件的文件级别注释 3 __packege # 获取模块文件的陌路名 4 __name__ # 只有执行(不是被导入的)当前文件时,特殊变量name才等于main,否则不等于.
re模块
这个模块提供了与 Perl 相似l的正则表达式匹配操作。Unicode字符串也同样适用。
正则表达式使用反斜杠" "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\ "表示正则表达式中的" ",因为正则表达式中如果要匹配" ",需要用来转义,变成" \ ",而Python语法中又需要对字符串中每一个进行转义,所以就变成了" \\ "。
上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用'r'作为字符串的前缀,如 r" ":表示两个字符""和"n",而不是换行符了。Python中写正则表达式时推荐使用这种形式。
绝大多数正则表达式操作与 模块级函数或RegexObject方法 一样都能达到同样的目的。而且不需要你一开始就编译正则表达式对象,但是不能使用一些实用的微调参数。
正则表达式元字符:
1 . 除换行符以外的任意一个字符 2 ^ 锚定行首,以什么字符(串)开头,如果^在中括号中,那么表示非的意思 3 & 锚定行首,以什么字符(串)结尾 4 * 重复匹配,可以重复0-多次 5 + 重复匹配,可以重复1-多次,最少有一个 6 ? 重复匹配,可以重复0-1次 7 {} 重复匹配,可以指定重复的次数,{1,5}或{3}.重复至少1次,最多5次或重复3次 8 [] 指定匹配范围,[a-z],表示a到z的任意字符,其他元字符在中括号中仅表示普通字符,除了- 9 () 分组匹配,匹配被括号起来的一组字符,小括号在re模块的大部分方法中还表示,在已经匹配到的数据中再去匹配,比如match,findall,search 10 转义,后面跟元字符取消元字符的特殊意义,后面跟普通字符实现特殊功能 11 d 任意十进制数字 12 D 任意任何非数字字符 13 s 匹配任何空白字符 14 S 匹配任何非空白字符 15 w 匹配任何字符数字字符 16 W 匹配任何非字符数字字符 17 匹配一个单词边界,也就是指单词和空格之间的位置
findall(查找字符串中所有匹配到的字符串,返回一个列表):
1 import re 2 result = re.findall('gouyc', 'gouyc123asdagouycfsdf') 3 print(result)
finditer(查找字符串中所有匹配到的字符串,从左到右匹配.返回一个迭代器,如果没有匹配到,返回空列表):
1 it = re.finditer(r'(gouyc)', 'gouycasddf12gouyc3123') 2 for i in it: 3 print(i.group())
match:
1 import re 2 re.match(r'gouyc', 'asdhgouyc').group()
注意:
-
match,只匹配字符串的起始位置,后面的不找
-
返回一个对象,通过对象的group()方法获取匹配到的内容
-
r表示原生字符串,去掉string中特殊字符串的意义.
search:
1 import re 2 3 re.search('yacai', 'yacai23laflyacai32njsdfj', flags=0)
search,匹配字符串中的所有位置,匹配到一个结果后停止.未匹配成功返回None
返回一个对象,通过对象的group()方法获取匹配到的内容
sub(查找替换):
1 re.sub(partten,repl,string,max=0)
group(用来获取findall,match,search返回的对象中的数据)
groups(用来获取findall,match,search返回的对象中的数据,以元祖的形式返回)
groupdict(用字典的方式返回findall,match,search返回的对象中的数据,需要在partten中指定key)
1 import re 2 re.match('h(?P<name>w+)', has hjksahk12332).groupdict
subn(不光替换,最后会统计替换的次数返回给我们)
split(以指定模式分割字符串,返回列表)
1 import re 2 re.split(1, 'one1two2three3four4')
compile(将模式编译成一个对象,通过对象的findall方法来查找)
1 import re 2 regex = re.compile(r'w*oo') 3 regex.findall('string')
反射
利用字符串的形式去对象(模块)中操作(查找,检查,调用)其成员,就叫做反射
1 import commons 2 3 if __name__ == '__main__': 4 inp = input('请输入url: ') 5 if hasattr(commons, inp): # 以字符串的形式去对象中检查属性,如果有返回True,否则返回False 6 url = getattr(commons, inp) # 以字符串的形式去对象中寻找属性,有则获取属性,否则报对象中没有属性的错误 7 url() # 执行getattr获取的属性 8 else: 9 print('404') 10 11 进阶版本 12 if __name__ == '__main__': 13 inp = input('请输入url: ') 14 m, f = inp.split('/') 15 obj = __import__(m) # 根据字符串去导入模块 16 if hasattr(obj, f): 17 url = getattr(obj, f) 18 url() 19 else: 20 print('404')
注意:如果模块在其他目录下,那么使用__import__()的时候,需要加一个参数,fromlist=True.否则,将只能找到目录,找不到目录下的模块.
递归(如果函数包含了对其自身的调用,该函数就是递归的):
递归实现阶乘
1 def func(num): 2 if num == 1: 3 return 1 4 return num * func(num - 1) 5 6 print(func(5))
Python冒泡排序算法的运作如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡算法排序
1 array = [1,2,3,6,5,4] 2 for i in range(len(array)): 3 for j in range(i): 4 if array[j] > array[j + 1]: 5 array[j], array[j + 1] = array[j + 1], array[j] 6 print array