上一篇已经讲述了什么是模块,下面我们再一起认识一些python中常用的模块。
一、os模块
前面也有用到过os模块,但那都是小儿科,os模块在日后的python撸码中将一直会伴随着你!
python编程时,经常和文件、目录打交道,这是就离不了os模块。os模块包含普遍的操作系统功能,与具体的平台无关。
要想使用模块,需先导入模块 如:import os 导入模块
1. os.name()——判断现在正在实用的平台,Windows 返回 ‘nt‘; Linux 返回’posix‘
1 print(os.name) 2 #结果 3 nt
2. os.getcwd()——得到当前工作的目录。
print(os.getcwd()) #结果 D:\学习功课\s13\day6
3. os.listdir()——指定所有目录下所有的文件和目录名,以列表的形式全部列举出来,其中没有区分目录和文件。
print(os.listdir(".")) #结果 [‘commons.py‘, ‘manager.py‘, ‘os模块.py‘, ‘sys模块.py‘, ‘test‘, ‘__pycache__‘, ‘冒泡排序.py‘, ‘加密模块.py‘, ‘反射.py‘]
4. os.remove()——删除指定文件
5. os.rmdir()——删除指定目 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
6. os.mkdir()——创建目录
7. os.path.isfile()——判断指定对象是否为文件。是返回True,否则False
8. os.path.isdir()——判断指定对象是否为目录。是True,否则False。
9. os.path.exists()——检验指定的对象是否存在。是True,否则False.
10. os.path.split()——返回路径的目录和文件名
11.os.system()——执行shell命令
12. os.chdir()——改变目录到指定目录
13.os.path.getsize()——获得文件的大小,如果为目录,返回0
14.os.path.abspath()——获得绝对路径
15.os.path.join(path, name)——连接目录和文件名。
16.os.path.basename(path)——返回文件名
17.os.path.dirname(path)——返回文件路径
18.os.environ——获取系统环境变量
19.os.removedirs(‘dirname1‘) ——若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
20.os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
21.os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
二、sys模块
1.sys.argv ——获取执行此程序路径,
命令行参数List,第一个元素是程序本身路径
1 print(‘hello‘) 2 for i in sys.argv: 3 print(i) 4 print(sys.argv) 5 6 #执行结果 7 hello 8 D:/学习功课/s13/day6/sys模块.py 9 [‘D:/学习功课/s13/day6/sys模块.py‘]
2.sys.exit(n) 退出程序,正常退出时exit(0) ,给shell中的退出差不多,退出返回值为0正常退出
3.sys.version 获取Python解释程序的版本信息
1 print(sys.version) 2 #结果 3 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)]
4.sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
>>> sys.path [‘‘, ‘C:\\Python\\Python35\\python35.zip‘, ‘C:\\Python\\Python35\\DLLs‘, ‘C:\\Py thon\\Python35\\lib‘, ‘C:\\Python\\Python35‘, ‘C:\\Python\\Python35\\lib\\site-p ackages‘]
5.os.path.append(os.path.dirname(path)) 添加路径到环境变量
6.sys.stdout.write(‘please:‘) 屏幕输出
1 >>> sys.stdout.write("abc") 2 abc3 3 >>> sys.stdout.write("abce") 4 abce4 5 >>> sys.stdout.write("abcer") 6 abcer5
7.sys.platfoem 返回操作系统名字
print(sys.platform) #结果 win32
三、hashbib 加密模块
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
def md5(passwd): test=hashlib.md5(bytes("qweqweqwe",encoding="utf-8")) test.update(bytes(passwd,encoding="utf-8")) names=test.hexdigest() return names print(names) r=md5("qwe") print(r) l=input("用户:") p=input("密码:") w=md5(p) print(w) if l=="tom" and w==r: print("good") else: print("gun!")
四、getattr()反射
利用字符串的形式去对象中寻找操作成员
如:getattr(commons,"login") 去commons模块中寻找字符“login的函数
hasattr():判断模块中的函数是否存在,存在为真,否则为假
delattr():删除某个模块的成员(函数)
setattr():这某个模块中设置一个成员(函数)
1 如:有一个模块‘commons’ 2 内容如下: 3 def login(): 4 print("登陆") 5 6 def logout(): 7 print("退出") 8 9 def home(): 10 print("主页面") 11 12 在另一个程序运行的导入commons 13 import commons 14 15 while True: 16 inp=input("输入url:").strip() 17 if hasattr(commons,inp): 18 test=getattr(commons,inp) 19 test() 20 else: 21 print(404) 22 break
__import__ 可以导入字符串的模块
__import__默认只导入第一个路径,如要导入lib.num,只导入lib
要想导入路径,后面去加个fromlist=True,如__import__("lib.num",fromlist=True )
1 while True: 2 inp=input("输入url:").strip() 3 m,f=inp.split("/") 4 obj=__import__(m,f) 5 if hasattr(obj,f): 6 test=getattr(obj,f) 7 test() 8 else: 9 print(404) 10 break 11 12 #如果输入的是commons/login #自动就会运行commons下得这个login()函数 13 输入url:commons/login 14 登陆
五、正则表达式
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。
语法 | 说明 | 表达式实例 | 完整匹配的字符串 |
. |
匹配除换行符“\n”任意单个字符 |
a.c | abc |
\ |
转义字符, 使后一个字符改变原来的意思 如果字符串中有特殊字符如*需要匹配,可以使用\*或者字符集[*] |
a\.c a\\c |
a.c a\c |
[.....] |
字符集对应的位置可以是字符集中任意字符 字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c] 在字符集中第一个字符是^,在这里是取反的意思,如[^abc]表示不是abc的其他字符, 所有特殊字符在字符集中都是去其原有的特殊含义 |
a[bcd]e |
abe ace ade |
\d | 数字:[0-9] | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\Sc | abc |
\w | 单词字符:[A-Za-z0-9] | a\wc | abc |
\W | 非单词字符:[^\w] | a\WC | a c |
* | 匹配前一个字符0或无限次给 "." 结合就是任意多字符 | abc* | ab |
+ | 匹配前一个字符1次或无限次 | abc+ |
abc abcccc |
? | 匹配前一个字符0次或1次 | abc |
ab abc |
{m} | 匹配前一个字符m次 | ab{2}c | abbc |
{m,n} |
匹配前一个字符m至n次 m和n可以忽略:若只有n 最多n次;只有m至少匹配m次 |
ab{1,2}c |
abc abbc |
^ |
匹配以什么字符串开头 如果是多行,就匹配每一行的开头 |
^abc | abc |
$ |
匹配字符串末尾 如果是多行,就匹配每一行de末尾 |
abc$ | abc |
\A | 仅匹配字符串开头 | \Aabc | abc |
\Z | 仅匹配字符串末尾 | abc\Z | abc |
\b |
匹配\w和\Wz之间 只是匹配字符串开头结尾及空格回车等的位置, 不会匹配空格符本身 |
abc s | abc |
| |
|代表左右表达式任意匹配一个 先尝试匹配左边,一旦成功匹配结束,反之继续 如果|没有被包括在()中,则它的范围是整个正则表达式 |
abc|qwe |
abc qwe |
(...) |
被括起来的表达式将作为分组, 从表法师左边开始每遇到一个分组的左括号“(”,编号+1 分组表达式作为一个整体,可以后接数量词 |
(abc){2} a(123|456)c |
abcabc a456c |
1、match(pattern, string, flags=0)
从起始位置开始根据模型去字符串中匹配指定内容,匹配单个
只从开头找,开头不满足指定内容也是不在寻找
pattern 正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式
match object 对象拥有以下方法:
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
1 ll="1234c23123c123a44444cac" 2 test=re.match(‘\d+‘,ll) 3 if test: 4 print(test.group()) 5 6 #显示结果 7 1234
2、search(pattern, string, flags=0)
根据模型去字符串中匹配指定内容,匹配单个
在字符串中寻找,找到一个满足条件的就返回
1 ll="qwec23123c123a44444cac" 2 test=re.search(‘\d+‘,ll) 3 if test: 4 print(test.group()) 5 6 #显示结果 7 23123
3、group和groups
group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
1. group()返回re整体匹配的字符串,
2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
3.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到
所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则
表达式中定义的组。
ll="23123c123a44444cac" test=re.search("([0-9]*)([a-z]*)([0-9]*)",ll) print(test.group()) print(test.group(1)) print(test.group(2)) print(test.group(3)) print(test.groups()) #返回结果 23123c123 23123 c 123 (‘23123‘, ‘c‘, ‘123‘)
4、findall(pattern, string, flags=0)
匹配多个,只要满足条件,就能取到
上述两中方式均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。
print(re.findall("a[bcd]e","adedsdfasdfbsdfabe")) ll="a1c23123c123a44444cac" print(re.findall(r‘a\dc‘,ll)) #返回结果 [‘ade‘, ‘abe‘] [‘a1c‘]
5、sub(pattern, repl, string, count=0, flags=0)
subn(pattern, repl, string, count=0, flags=0) #能统计出,供替换了几次
用于替换匹配的字符串
ll = "23123c123a44444cac213" test=re.sub(‘\d+‘,‘SB‘,ll) test1=re.subn(‘\d+‘,‘SB‘,ll) print(test) print(test1) #显示结果 SBcSBaSBcacSB (‘SBcSBaSBcacSB‘, 4)
6、split(pattern, string, maxsplit=0, flags=0)
根据指定匹配进行分组 ,生成list类型
content = "‘1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )‘" test=re.split(‘\*‘,content) print(test) #显示结果 ["‘1 - 2 ", ‘ ((60-30+1‘, ‘(9-2‘, ‘5/3+7/3‘, ‘99/4‘, ‘2998+10‘, ‘568/14))-(-4‘, ‘3)/(16-3‘, "2) )‘"]
1 inpp = ‘1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))‘ 2 3 new_content = re.split(‘\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)‘, inpp) 4 new_contents = re.split(‘\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)‘, inpp,1) #取一次匹配到的结果 5 print(new_content) 6 print(new_contents) 7 8 #上边的正则意思是匹配括号中的括号 9 10 #结果 11 [‘1-2*((60-30 +‘, ‘-40-5‘, ‘*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - ‘, ‘-4*3‘, ‘/ (16-3*2))‘] 12 [‘1-2*((60-30 +‘, ‘-40-5‘, ‘*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))‘]