Python开发【第六篇】:模块
模块,用一堆封装好的代码,实现某个功能的代码集合。
类似与函数编程和面向过程编程,函数式编程则完成一个功能。其他的代码可用来调动即可。提供了代码重用性和代码间的耦合性。而对于一个复杂的功能来说,可能需要多个函数才可以完成(函数又可以在不同的py文件中),n个.py文件注册的代码集合就称为模块。
如:os是系统相关的模块,file是文件操作相关的模块。
模块分为三种:
自定义模块
第三方模块
内置模块
1.自定义模块:
2.导入模块
python之所以应用越来越广泛,在一定程度上也依赖于为程序员提供了大量的模块可以使用。如果想要使用模块,直接导入就可以了!导入模块有以下几种办法:
import module from module.xx.xx import xx from module.xx.xx import xx as rename from module.xx.xx import *
导入模块其实就是告诉python解释器去解释那个py文件
导入一个py文件,解释器解释该py文件。
导入一个包,解释器解释该包下的__init__.py文件【py2.7】
那么问题来了,导入模块就是根据那个路径作为来基准来进行的呢?即:sys.path
import sys print(sys.path)
#输出的结果是
#['C:\\Users\\demo\\PycharmProjects\\q1\\复习', 'C:\\Users\\demo\\PycharmProjects\\q1', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages']
如果sys.path路径列表没有你想要的路径,可以通过sys.path.append('路径')添加
import sys import os project_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ret=sys.path.append(project_path) print(ret) print(project_path) #运行结果:None # C:\Users\demo\PycharmProjects\q1
模块:内置模块是python自带的功能,在使用内置模块的相应的功能时,需要【先导入】再【使用】
一:sys
用于提供对python解释器相关的操作
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys #命令行参数list,第一个元素是程序本身路径 # print(sys.argv) # 退出程序,正常退出时exit(0) # print(sys.exit(2)) # 获取python解释程序的版本信息 print(sys.version) # 返回模块的搜索路径,初始化时使用pythonpath环境变量的值 print(sys.path) # print(sys.maxsize) #最大的int值 # print(sys.maxint) #返回操作系统的平台名称 print(sys.platform) # 输入相关 print(sys.stdin) # 输出相关 # print(sys.stout) # 错误相关 print(sys.stderr) from 复习 import demo5
进度条百分比:
import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100) r = '\r%d%%' % (rate_num, ) sys.stdout.write(r) sys.stdout.flush() if __name__ == '__main__': for i in range(0, 100): time.sleep(0.1) view_bar(i, 100)
二:os
用于提供系统级别的操作:
完整列表:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dir1/dir2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","new") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 用于分割文件路径的字符串 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所指向的文件或者目录的最后修改时间
亲手敲的并且实现的:
import os #获取当前工作目录,即当python脚本的目录路径 # print(os.getcwd()) # 改变当前脚本工作目录,相当于shell下的cd # print(os.chdir('../qq')) # print(os.getcwd()) # print(os.chdir('../pro_0811')) # print(os.getcwd()) # """ # 运行的结果 # C:\Users\demo\PycharmProjects\q1\复习 # None # C:\Users\demo\PycharmProjects\q1\qq # None # C:\Users\demo\PycharmProjects\q1\pro_0811 # """ #返回当前目录:(".") print(os.curdir) #返回上级目录:(".") print(os.pardir) # """#可生成多层递归目录 # import time # print(os.makedirs('dir1/dir2')) # time.sleep(2) # 若目录未空则删除,并递归到上一级目录,若也为空,则删除,以此类推 # print(os.removedirs('dir1/dir2')) # """ # """ #创建文件夹 # os.mkdir('demo1') #删除文件夹 # os.rmdir('demo1') # """ #输出当前目录下的文件列表 # print(os.listdir()) #移除某指定文件名 # os.remove('s1.dobi') #重命名文件 # os.rename("s1.py","s2.py") #获取文件/目录信息 print(os.stat('./'))
三:hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供sha1,sha224,sha256,sha384,sha512,md算法
import hashlib #############md5############# hash=hashlib.md5() # help(hashlib.update) hash.update(bytes("admin",encoding="utf-8")) print(hash.hexdigest()) print(hash.digest()) #############md5############# hash1=hashlib.md5() hash1.update(bytes("youadmin",encoding="utf-8")) print(hash1.hexdigest()) print(hash1.digest()) #############sha1############# hash2=hashlib.sha1() hash2.update(bytes("admin",encoding="utf-8")) print(hash2.hexdigest()) print(hash2.digest()) #############sha1############# hash3=hashlib.sha1() hash3.update(bytes("youradmin",encoding="utf-8")) print(hash3.hexdigest()) print(hash3.digest()) #############sha256############# hash4=hashlib.sha256() hash4.update(bytes("admin",encoding="utf-8")) print(hash4.hexdigest()) print(hash4.digest()) hash5=hashlib.sha256() hash5.update(bytes("youradmin",encoding="utf-8")) print(hash5.hexdigest()) print(hash5.digest()) #############sha384############# hash6=hashlib.sha3_384() hash6.update(bytes("youradmin",encoding="utf-8")) print(hash6.hexdigest()) print(hash6.digest()) hash7=hashlib.sha3_384() hash7.update(bytes("admin",encoding="utf-8")) print(hash7.hexdigest()) print(hash7.digest()) #############sha512############# hash8=hashlib.sha3_512() hash8.update(bytes("admin",encoding="utf-8")) print(hash8.hexdigest()) print(hash8.digest())
上面的加密虽然算法已经非常厉害了,但是还是存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
运行结果是:
C:\Python36\python.exe C:/Users/demo/PycharmProjects/q1/复习/demo7.py 21232f297a57a5a743894a0e4a801fc3 b'!#/)zW\xa5\xa7C\x89J\x0eJ\x80\x1f\xc3' 2c2171f7cdda5f4be0c075512a81c07a b',!q\xf7\xcd\xda_K\xe0\xc0uQ*\x81\xc0z' d033e22ae348aeb5660fc2140aec35850c4da997 b'\xd03\xe2*\xe3H\xae\xb5f\x0f\xc2\x14\n\xec5\x85\x0cM\xa9\x97' a20d9bed455a369cec9ca2af17794ca019c9776a b'\xa2\r\x9b\xedEZ6\x9c\xec\x9c\xa2\xaf\x17yL\xa0\x19\xc9wj' 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 b'\x8civ\xe5\xb5A\x04\x15\xbd\xe9\x08\xbdM\xee\x15\xdf\xb1g\xa9\xc8s\xfcK\xb8\xa8\x1fo*\xb4H\xa9\x18' c734fd7429dd05e50403c08a1fd589f18359a3c55d25dbcfc2349053f12fd8b1 b'\xc74\xfdt)\xdd\x05\xe5\x04\x03\xc0\x8a\x1f\xd5\x89\xf1\x83Y\xa3\xc5]%\xdb\xcf\xc24\x90S\xf1/\xd8\xb1' 7fbd6b70ed2246af37a830eb4c3af765e6a227a45600c1f4bd7ce777fc332a12ab11b4b73c56be281b56c928e9c6faff b'\x7f\xbdkp\xed"F\xaf7\xa80\xebL:\xf7e\xe6\xa2\'\xa4V\x00\xc1\xf4\xbd|\xe7w\xfc3*\x12\xab\x11\xb4\xb7<V\xbe(\x1bV\xc9(\xe9\xc6\xfa\xff' 9765a57f2010506383de91052915ce8bafbdb39f3e5a8c1a1693a0076365d37abbfd3305881ea3b5fa1426316afd7df3 b'\x97e\xa5\x7f \x10Pc\x83\xde\x91\x05)\x15\xce\x8b\xaf\xbd\xb3\x9f>Z\x8c\x1a\x16\x93\xa0\x07ce\xd3z\xbb\xfd3\x05\x88\x1e\xa3\xb5\xfa\x14&1j\xfd}\xf3' 5a38afb1a18d408e6cd367f9db91e2ab9bce834cdad3da24183cc174956c20ce35dd39c2bd36aae907111ae3d6ada353f7697a5f1a8fc567aae9e4ca41a9d19d b'Z8\xaf\xb1\xa1\x8d@\x8el\xd3g\xf9\xdb\x91\xe2\xab\x9b\xce\x83L\xda\xd3\xda$\x18<\xc1t\x95l \xce5\xdd9\xc2\xbd6\xaa\xe9\x07\x11\x1a\xe3\xd6\xad\xa3S\xf7iz_\x1a\x8f\xc5g\xaa\xe9\xe4\xcaA\xa9\xd1\x9d'
可以看到,加密是越来越复杂,而且自定义字段,也越来越复杂,这长度也会越来越长!基本这样的直观感受!
python内置还有一个hmac模块,它内部对我们创建key和内容进行进一步的处理,然后加密
import hmac h=hmac.new(bytes('898989sadadsdas',encoding="utf-8")) h.update(bytes('admin',encoding="utf-8")) print(h.hexdigest()) print(h.digest()) #运行结果 """ C:\Python36\python.exe C:/Users/demo/PycharmProjects/q1/复习/demo8.py 775654c8c29f2fde3b5fd83e3c998fcb b'wVT\xc8\xc2\x9f/\xde;_\xd8><\x99\x8f\xcb' """
四:random
import random print(random.random()) print(random.randint(1,2)) print(random.randrange(1.0,20.0)) """ 运行结果: 0.9885385464501338 1 11 """
来写一个验证码模块:
#验证码模块 import random checkcode=" " for i in range(4): current=random.randrange(0,4) if current !=i: temp=chr(random.randrange(65,90)) else: temp=random.randrange(0,9) checkcode+=str(temp) print(checkcode)
五:re模块
python中的re模块提供了正则表达式相关操作
字符:
.匹配除换行符意外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配字符串的开始或者结束
^匹配字符串的开始
$匹配字符串的结束
次数:
* 重复零次或者多次
+重复一次或者更多次
?重复零次或者一次
{n}重复n次
{n,}重复n次或者更多次
{n,m}重复n到m次
match函数
import re text='pythontab' m=re.match(r"\w+",text) if m: print (m.group(0)) else: print ('not match') r = re.match(r"(\w+)", text) if r: print(m.group(0)) else: print("not match") """ 输出结果: pythontab pythontab """
search函数
#!/usr/bin/env python # -*- coding:utf-8 -*- import re """ text="pythontab" m=re.match(r"\w+",text) if m: print(m.group(0)) else: print("not match") """ text="pyt2ho23ntab" m=re.search(r"\d+",text) if m: print(m.group(0)) else: print("not match") """ 运行的结果: C:\Python36\python.exe C:/Users/demo/PycharmProjects/q1/复习/demo12.py 2 """
match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none!
Python中正则表达式match()函数
如果不创建pattern对象,我们使用match函数可以直接进行正则表达式的匹配,在我看来这种方式更简洁,不过不适合大型程序的编写,后期维护可能会产生困难,不过编写一些小脚本完全可以胜任。
六、序列化
python中用于序列化的俩个模块
json用于【字符串】和【python基本数据类型】间进行转换
pickle用于【python特有的类型】和【python基本数据类型】间进行转换
json模块提供了四个功能:dumps,dump,loads,load
pickle模块提供了四个功能:dumps,dump,loads,load
#pickle模块:
data={'k1':123,'k2':"hello"} import pickle p_str= pickle.dumps(data) print(p_str) with open('D:/result.pickle','w') as fp: pickle.dumps(p_str,fp) """ Traceback (most recent call last): #输出效果,不知道为什么报错····我也是一脸误解。这俩留做问题吧!!!! b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00helloq\x03u.' File "C:/Users/demo/PycharmProjects/q1/复习/demo1_序列化.py", line 10, in <module> pickle.dumps(p_str,fp) TypeError: an integer is required (got type _io.TextIOWrapper) """
#json序列化demo
#!/usr/bin/env python # -*- coding:utf-8 -*- data={'k1':123,'k2':'hello'} import json j_str=json.dumps(data) print(j_str) with open('D:/result.json','w')as fp: json.dump(data,fp) """ 输出的结果为: {"k1": 123, "k2": "hello"} """
七:

浙公网安备 33010602011771号