首页 > 代码库 > Python模块整理
Python模块整理
这两天学习了一些基本的Python模块,现在做一些整理,理清楚
查看大佬的理解:http://www.cnblogs.com/alex3714/articles/5161349.html
开始时间:15:32:06 先标一下开始时间,看看用多久写完这一篇整理= =
分别是以下几个模块:
- import 模块调用
- time 时间模块
- os 系统管理模块
- ranadom 随机数模块
- re 正则表达式模块
- sys 环境配置模块
- json pickle 模块
- hashlib 哈希模块
import 模块调用
import是一个用的最多的一种方法,它应该不算是一个模块,但是在理解模块前必须得理解import这个方法
1 import time #导入时间模块 2 import time from time #从时间模块导入time()函数 3 import time from time as TIME #同上,并赋予新名称为TIME 4 ‘‘‘ 5 import 的实质就是执行导入的代码 6 包的本质是一个目录(内部必须含有__init__.py)用来从逻辑上组织模块 7 导入包,即执行该包下的__init__.py文件 8 注意import只会在当前环境变量中搜索导入的包,所以当跨文件导入包时,要先添加环境变量,如下添加环境变量: 9 ‘‘‘ 10 import os 11 #help(os) 12 import sys 13 print(sys.path)#查看当前环境路径 14 print(__file__)#查看当前文件相对路径 15 #所谓相对路径,例如:/pytext/zhihu/day5_1.py 这就是相对路径 16 #将相对路径修改为绝对路径 17 print()#现在输出的就是绝对路径 18 #通过下面的方法返回上一级文件,例如,返回一层 19 print() 20 #依次类推,就能找到所需要添加的环境变量 21 #找到后如下添加到环境路径中 22 sys.path.append(os.path.dirname(os.path.abspath(__file__))) 23 #一般要用到的话至少返回两层以上,此处简写了
1 import time #导入时间模块 2 import time from time #从时间模块导入time()函数 3 import time from time as TIME #同上,并赋予新名称为TIME 4 ‘‘‘ 5 import 的实质就是执行导入的代码 6 包的本质是一个目录(内部必须含有__init__.py)用来从逻辑上组织模块 7 导入包,即执行该包下的__init__.py文件 8 注意import只会在当前环境变量中搜索导入的包,所以当跨文件导入包时,要先添加环境变量,如下添加环境变量: 9 ‘‘‘ 10 import os 11 #help(os) 12 import sys 13 print(sys.path)#查看当前环境路径 14 print(__file__)#查看当前文件相对路径 15 #所谓相对路径,例如:/pytext/zhihu/day5_1.py 这就是相对路径 16 #将相对路径修改为绝对路径 17 print()#现在输出的就是绝对路径 18 #通过下面的方法返回上一级文件,例如,返回一层 19 print() 20 #依次类推,就能找到所需要添加的环境变量 21 #找到后如下添加到环境路径中 22 sys.path.append(os.path.dirname(os.path.abspath(__file__))) 23 #一般要用到的话至少返回两层以上,此处简写了
导入优化,假如一个模块包含很多函数,但是你仅仅需要其中一个,此时就可以使用from来优化函数的调用,
减少内存的消耗,不对,就是尽量使用from,以最大化优化,避免冗余的代码工作
time 时间模块
在时间模块中,时间被定义成三种形式
- 时间戳: 时间戳是指从1970年1月1日零点开始距离现在的时间多少,它以秒为格式
- 时间元组: struct_time 是以九种时间格式组成的元组
- 时间字符串形式: 就是平常见到的年月日,时分秒
1 ‘‘‘ 2 该模块中所有函数如下 3 time() -- return current time in seconds since the Epoch as a float 4 返回当前的时间戳 5 clock() -- return CPU time since process start as a float 6 返回处理器时间,3.3开始已废弃 , 改成了time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来 7 sleep() -- delay for a number of seconds given as a float 8 作用使程序暂停一段时间 9 gmtime() -- convert seconds since Epoch to UTC tuple 10 返回标准时间,即格林尼治时间 11 localtime() -- convert seconds since Epoch to local time tuple 12 返回本机时间,已时间元组的形式返回 13 asctime() -- convert time tuple to string 14 将时间元组转化为字符串形式 15 ctime() -- convert time in seconds to string 16 将时间戳转换成字符串形式 17 mktime() -- convert local time tuple to seconds since Epoch 18 将时间戳转换成时间元组形式 19 strftime() -- convert time tuple to string according to format specification 20 按照给定的格式将时间元组转换成字符串形式 21 strptime() -- parse string to time tuple according to format specification 22 与上一个相反 23 tzset() -- change the local timezone 24 改变当前时区= =旅行必备,可以通过这个开发一个自动调整为当地时间的工具 25 ‘‘‘
这个部分在帮助文档里说的很细,有什么不清楚请用help(time)
再说一下时间元组的九个元素
- tm_hour 一天24个小时
- tm_isdst 是否是夏令时,1为是,0为否,-1为不知道
- tm_mday 这个月中的第几天
- tm_min 这个小时中的第多少分钟
- tm_mon 一年中的第几个月
- tm_sec 这分钟中的第几秒
- tm_wday 这一周中的第几天
- tm_yday 这一年中的第几天
- tm_year 今夕是何年呐
时间元组的格式如下:
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=10, tm_hour=16, tm_min=53, tm_sec=55, tm_wday=0, tm_yday=100, tm_isdst=0)
另外还有一个datetime模块,是基于time模块的一个加强版
os 系统管理模块
提供对操作系统进行调用的方法
1 #文件操作中,这个版块很重要 2 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 3 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 4 os.curdir 返回当前目录: (‘.‘) 5 os.pardir 获取当前目录的父目录字符串名:(‘..‘) 6 os.makedirs(‘dirname1/dirname2‘) 可生成多层递归目录 7 #是指可以连续在建立的新文件中建立新文件,本质是对mkdir的重复调用 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","newname") 重命名文件/目录 14 os.stat(‘path/filename‘) 获取文件/目录信息 15 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 16 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 17 os.pathsep 输出用于分割文件路径的字符串 18 os.name 输出字符串指示当前使用平台。win->‘nt‘; Linux->‘posix‘ 19 os.system("bash command") 运行shell命令,直接显示 20 os.environ 获取系统环境变量 21 os.path.abspath(path) 返回path规范化的绝对路径 22 os.path.split(path) 将path分割成目录和文件名二元组返回 23 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 24 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 25 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 26 os.path.isabs(path) 如果path是绝对路径,返回True 27 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 28 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 29 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 30 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 31 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
之前还在想这个操作里面怎么没有建立新文件,现在想想直接用‘w‘模式写入不就创建了一个新文件嘛
这个模块用到的地方还是挺多的,文件的建立,删除,路径查询,在垃圾文件的处理方面应该也用的上
random 随机数模块
这个模块有意思了,程序中很多地方都要用到这种伪随机数,游戏里可以用到
1 import time 2 import random 3 puke = [] 4 huase = [‘红心‘,‘梅花‘,‘黑桃‘,‘方块‘] 5 for one in range(0,4): 6 aa = [] 7 for i in range(1,14): 8 i = huase[one] + str(i) 9 puke.append(i) 10 puke.append(‘大王‘) 11 puke.append(‘小王‘) 12 print(puke) 13 print(len(puke)) 14 for num in range(10): 15 print(random.sample(puke,17)) 16 while True: 17 beilv = 1 18 person = random.shuffle(puke) 19 person1 = puke[0:17] 20 print(len(person1),person1) 21 person2 = puke[17:34] 22 print(len(person2),person2) 23 person3 = puke[34:51] 24 print(len(person3),person3) 25 choose = puke[51:55] 26 #现在把扑克牌分发显示给各位玩家 27 #玩家反馈是否叫地主,由随机庄家开始叫地主,如果抢地主则倍率*2 28 #将底牌加入地主的牌库 29 #现在设立一个监视器,判断出牌是否符合规则,并且监视每一位的手牌数 30 #一局结束后,询问是否go on? 31 break
斗地主的一个大概思路,什么时候有时间来完成
random.shuffle() 将输入列表随机排序
sys 环境配置模块
sys模块用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,例如与Python解释器交互
1 import sys 2 #sys模块中包含了各种所需的配置 3 sys.argv[0] #显示代码所在文件的路径 4 #如结果:[‘D:/python/workrom/day10/进程process.py‘] 5 sys.path #返回当前环境配置(文件搜索路径,模块搜索路径) 6 sys.maxsize #所接受的最大int值,以避免数据溢出 7 sys.platform # 返回操作系统平台名称 win32 Linux
sys.stdin.readline() 监听键盘输入,直至回车,类似input
sys.stadout.write(‘打印值:‘) 可以用来做进度条 同 print(end=‘‘), 即不换行,在同一行进行多次输出
re 正则模块
re正则模块用于匹配字符串形式文件中的目标字符串,可以进行替换
下面举一个例子来看一看正则的用法
1 import re 2 3 def fuhao_chuli(string): 4 if ‘--‘ in string: 5 string = string.replace(‘--‘,‘+‘) 6 if ‘+-‘ in string: 7 string = string.replace(‘+-‘,‘-‘) 8 if ‘-+‘ in string: 9 string = string.replace(‘-+‘,‘-‘) 10 return string 11 12 def jisuan(string): 13 ‘‘‘ 14 :param string:格式化后的计算式 ,形式如:A+B,仅含三项,数字+运算符+数字 15 :return: 计算结果 16 ‘‘‘ 17 # 先把运算符取出来 18 pattern = re.compile(r‘\d([*+/-])-?\d‘, re.S) 19 fuhao = re.findall(pattern, string)[0] 20 pattern1 = re.compile(r‘(.*\d)[*+/-](-?\d.*)‘) 21 num = re.findall(pattern1,string) 22 num1 = float(num[0][0]) 23 num2 = float(num[0][1]) 24 if fuhao == ‘+‘: 25 jieguo = num1 + num2 26 elif fuhao == ‘-‘: 27 jieguo = num1 - num2 28 elif fuhao == ‘*‘: 29 jieguo = num1 * num2 30 elif fuhao == ‘/‘: 31 if num2 == 0: 32 print(‘分母不可为0‘) 33 jieguo = ‘wrong‘ 34 return jieguo 35 jieguo = num1 / num2 36 jieguo = round(jieguo,7) 37 return jieguo 38 #一直在正则匹配出问题,需要再熟悉 39 def kuohao_jisuan(string):#本来以为已经解决问题,但是在浮点数处遇到问题,不能以string,太麻烦 40 ‘‘‘ 41 该函数将最底层含括号进行运算,思路,先乘除,后加减 42 :param string: 内部无括号的计算式,字符形式 43 :return: 计算结果 44 ‘‘‘ 45 if ‘*‘ in string or ‘/‘ in string: 46 #pattern = re.compile(r‘\d+[*/][*/0-9]+‘,re.S)#‘1+2*3*4‘ 47 # pattern = re.compile(r‘\d[*/0-9.]+\d‘)#换一种匹配规则:加减中间含乘除的匹配项 48 # chen_chu = re.findall(pattern,string)#‘2*3*4‘ 49 # #print(chen_chu) 50 # for ch_ch_one in chen_chu: 51 #print(string) 52 pattern_ch_ch = re.compile(r‘[0-9.]+[*/]-?[0-9.]+‘,re.S)#取出乘除的第一项 53 zu_chen_chu = re.findall(pattern_ch_ch,string)#‘2*3‘ 54 answer = str(jisuan(zu_chen_chu[0])) 55 string = string.replace(zu_chen_chu[0],answer) 56 return kuohao_jisuan(string) 57 else: 58 try: 59 string = fuhao_chuli(string) 60 float(string) 61 return string 62 except: 63 string = fuhao_chuli(string) 64 pattern_j_j = re.compile(r‘-?[0-9.]+[+-][0-9.]+‘,re.S) 65 zu_jia_jian = re.findall(pattern_j_j,string) 66 answer = str(jisuan(zu_jia_jian[0])) 67 string = string.replace(zu_jia_jian[0], answer) 68 return kuohao_jisuan(string) 69 #print(kuohao_jisuan(‘-6-2*3/4-4*2‘)) 70 #主函数,现将最底层括号匹配,然后计算后返回替代 71 def all_jisuan(string): 72 string = string.replace(‘ ‘,‘‘) 73 if ‘(‘ not in string and ‘)‘ not in string: 74 string = kuohao_jisuan(string) 75 return string 76 else: 77 pattern = re.compile(r‘\([^()]+\)‘, re.S)#括号开始括号结束,中间没有括号 78 base_kh_list = re.findall(pattern,string) 79 for base_kh in base_kh_list: 80 base_kh1 = base_kh[1:-1]#base_kh为去除括号的算式 81 kuohao_out = kuohao_jisuan(base_kh1) 82 string = string.replace(base_kh,kuohao_out) 83 string = fuhao_chuli(string) 84 return all_jisuan(string) 85 return string 86 #替换之后可能出现*- +- -- /-这样的情况,所以这时候就需要处理 87 def start(): 88 while True: 89 shuru = str(input(‘q is out\ninput:\n‘)) 90 if shuru == ‘q‘: 91 break 92 answer = all_jisuan(shuru) 93 if ‘+‘ in answer: 94 answer = answer[1:] 95 print(answer) 96 97 if __name__ == ‘__main__‘: 98 start()
上面这个计算器是属于匹配边修改才做出来的,一步步试,其中用到了大量的[]操作
更详细具体看一看http://www.cnblogs.com/dreamer-fish/p/5282679.html
pickle/json 模块
load/loads 读取pickle/json格式,load从文件读取,loads从读取的为内存中的对象
dump/dumps 编码为pickle/json格式,dump为编码写入到文件,dumps为编码到内存中的对象
hashlib 哈希模块
哈希模块用于对对象的加密及确认对象是否被修改
1 import hashlib 2 3 a = "a test string".encode() 需要哈希加密的文件需先encode为字节形式 4 a.update(‘add‘.encode()) 假如新的需要加密的部分 5 print(hashlib.md5(a).hexdigest()) 6 print(hashlib.sha1(a).hexdigest()) 7 print(hashlib.sha224(a).hexdigest()) 8 print(hashlib.sha256(a).hexdigest()) 9 print(hashlib.sha384(a).hexdigest()) 10 print(hashlib.sha512(a).hexdigest())
http://www.atool.org/hash.php有对各种编码的解释
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
import hmac h = hmac.new(b‘天王盖地虎‘, b‘宝塔镇河妖‘) print h.hexdigest()
阮一峰对加密这一部分可以去他的博客参照一下
外文参照MD5,sha1,sha256等:https://www.tbs-certificates.co.uk/FAQ/en/sha256.html
MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160 - aTool
Python模块整理