模块:os、sys、time、logging、json/pickle、hashlib、random、re
模块分为三种:
- 自定义模块
- 第三方模块
- 内置模块
自定义模块
1、定义模块
将一系列功能函数或常量封装为一个独立的.py或多个.py文件。
2、导入模块
1 import module 2 from module.xx import yy 3 from module.xxxxx import as rename 对于难于编写可以将其重新命名为一个新的模块名字 4 from module.xx import * #不介意应用这种导入方式,此种方式对于较大模块容易产生函数名冲突。
3、导入模块基准路径
import sys sys.path.append("导入模块的路径")
import os import sys project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(project_path)
注:os.path.dirname()表示当前目录的上一级目录
内置模块
所谓内置模块是python自带的模块,使用前先导入。
一、sys
相关操作:
sys.argv #命令行参数列表,第一个参数默认是程序路径 sys.exit(n) #退出程序 sys.version #获取python解释器的版本信息 sys.maxint #最大的int值 sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.stdin #输入相关 sys.stdout #输出相关 sys.stderror #错误相关
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 = ' %s>%d%%' % ("."*rate_num,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)
二、os
用于提供系统级别的操作——常用一些功能
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False. 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.path.abspath(path) #返回path规范化的绝对路径 os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 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.isabs(path) #如果path是绝对路径,返回True os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False
三、time
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
1 print time.time()#1970年1月1日之后的秒 2 print time.mktime(time.localtime()) 3 4 print time.gmtime() #可加时间戳参数 5 print time.localtime() #可加时间戳参数 6 print time.strptime('2014-11-11', '%Y-%m-%d') 7 8 print time.strftime('%Y-%m-%d') #默认当前时间 9 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间 10 print time.asctime() 11 print time.asctime(time.localtime()) 12 print time.ctime(time.time()) 13 14 import datetime 15 ''' 16 datetime.date:表示日期的类。常用的属性有year, month, day 17 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond 18 datetime.datetime:表示日期时间 19 datetime.timedelta:表示时间间隔,即两个时间点之间的长度 20 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 21 strftime("%Y-%m-%d") 22 ''' 23 import datetime 24 print datetime.datetime.now() 25 print datetime.datetime.now() - datetime.timedelta(days=5)
补充:
print(time.asctime(time.localtime())) #返回时间格式Mon Oct 24 21:21:03 2016" print(time.ctime()) #返回Mon Oct 24 21:22:03 2016 格式, 同上 print(time.ctime(time.time()-86400))#返回Sun Oct 23 21:22:03 2016 返回当前时间的前一天 print(time.gmtime()) #返回一个struct_time 结构体 将当前时间赋值在struct_time每一个成员中(这里时间是utc时间应该是格林威治时间) time.mktime(time.localtime())# mktime 必须传一个struct_time 对象否则报错,将时间对象转换为时间戳 time.sleep(4) #阻塞秒数
%Y Year with century as a decimal number. %m Month as a decimal number [01,12]. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %M Minute as a decimal number [00,59]. %S Second as a decimal number [00,61]. %z Time zone offset from UTC. %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. %I Hour (12-hour clock) as a decimal number [01,12]. %p Locale's equivalent of either AM or PM.
四、logging 日志模块
- 单文件日志
1 #写到文件 指定日志级别 注:只有高于或者等于指定级别的信息才会被记录 Debug info warning error critical 2 logging.basicConfig(filename='example.log', level=logging.INFO, 3 format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p') 4 5 logging.debug("I am a debug log ") 6 logging.info("info log") 7 logging.warning("warning log") 8 logging.error("error log") 9 logging.critical("critical log")
- 多文件日志
1 import logging 2 #create a logger 3 logger = logging.getLogger('TEST_LOG') 4 logger.setLevel(logging.WARNING) #全局日志级别 #如果全局级别高 以全局为准 如果局部变量的级别高 就按局部, 5 #换句话说 局部最高就优先 全局级别最高 就优先 6 7 #创建输出到屏幕的 handler 8 ch = logging.StreamHandler() 9 ch.setLevel(logging.DEBUG) #设置 屏幕输出日志级别 10 11 #创建输出到文件的handler 12 fh = logging.FileHandler("access.log") 13 fh.setLevel(logging.DEBUG) 14 15 #往另一个文件写 16 fh2 = logging.FileHandler("access2.log") 17 fh2.setLevel(logging.ERROR) 18 #创建输出格式 19 formatter_ch = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s ') 20 formatter_fh = logging.Formatter('%(asctime)s-%(filename)s-%(module)s-%(lineno)d-%(levelname)s-%(message)s') 21 22 #设定 格式 23 ch.setFormatter(formatter_ch) 24 fh.setFormatter(formatter_fh) 25 fh2.setFormatter(formatter_fh) 26 27 #将handler 注册到logger 28 logger.addHandler(ch) 29 logger.addHandler(fh) 30 logger.addHandler(fh2) 31 32 logger.debug("debug log ") 33 logger.info("info log") 34 logger.warning("warning log") 35 logger.error("error log") 36 logger.critical("critical log")
Format:日志记录格式
五、序列化
- json 用于【字符串】和 【python基本数据类型】 间进行转换
- pickel 用于【python特有的类型】 和 【python基本数据类型】间进行转换
1 import json 2 import requests 3 #序列化 是将python基本数据类型转化为字符串 4 dic ={"key":123} 5 print(dic,type(dic)) 6 ret = json.dumps(dic) 7 print(ret,type(ret)) 8 9 #反序列化 将字符串转化为python 基本数据类型 10 dic2 = json.loads(ret) 11 print(dic2,type(dic2)) 12 13 re =requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京') 14 re.encoding ='utf-8' 15 print(re.text) 16 #转化为字典 进行操作 17 w_dic = json.loads(re.text) 18 print(w_dic,type(w_dic)) 19 20 #dump and load #dump 先序列化 然后在写入文件 load 先读出来再将数据反序列化为python基本数据类型 21 li = [11,22,33] 22 json.dump(li,open('db','w')) 23 li2 = json.load(open('db','r')) 24 print(li2,type(li2))
六、加密hashlib模块
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法:用法基本相同
1 import hashlib 2 def md5(str): 3 md5_obj = hashlib.md5() # 更安全 可以 md5(bytes(str,encoding='utf-8')) 4 md5_obj.update(bytes(str,encoding="utf-8")) 5 encodetext =md5_obj.hexdigest() 6 print(encodetext) 7 md5("sdfdsf")
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
1 import hmac 2 h = hmac.new(bytes('898oaFs09f',encoding="utf-8")) h.update(bytes('admin',encoding="utf-8")) 3 print(h.hexdigest())
七、随机数random模块
1 import random 2 3 print(random.random()) 4 print(random.randint(1, 2)) 5 print(random.randrange(1, 10))
随机验证码实现:
import random checkcode = '' for i in range(4): current = random.randrange(0,4) if current != i: temp = chr(random.randint(65,90)) else: temp = random.randint(0,9) checkcode += str(temp) print checkcode
第三方模块
- 安装:
pip3 install requests
- 源码安装
例子:安装request
1.下载第三方模块源码(百度搜索模块名字)
http://www.python-requests.org/en/master/user/install/#install
2.解压模块
3.cd 到setup.py目录下
4.执行 python setup.py install (如果不依赖其他模块,直接就会安装成功)
提示(正则表达式我将单独整理)
>>>END