1.time、datetime 时间模块
2.random 随机模块
3.os 与操作系统交互的一个接口
4.sys 与python解释器交互的一个接口
5.json 序列化模块
6.hashlib 可以用来加密
7.re 正则匹配模块
8.loggin 日志模块
一、time和datetime模块
time模块有三种表现形式: 时间戳\格式化时间字符串\时间原则
#导入时间模块
>>>import time
#时间戳
>>>time.time()
1500875844.800804
#时间字符串
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 13:54:37'
>>>time.strftime("%Y-%m-%d %H-%M-%S")
'2017-07-24 13-55-04'
#时间元组:localtime将一个时间戳转换为当前时区的struct_time
time.localtime()
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,
tm_hour=13, tm_min=59, tm_sec=37,
tm_wday=0, tm_yday=205, tm_isdst=0)
小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
#时间戳-->结构化时间
#time.gmtime(时间戳) #UTC时间,与英国伦敦当地时间一致
#time.localtime(时间戳) #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间
>>>time.gmtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
>>>time.localtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
#结构化时间-->时间戳
#time.mktime(结构化时间)
>>>time_tuple = time.localtime(1500000000)
>>>time.mktime(time_tuple)
1500000000.0
#结构化时间-->字符串时间
#time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则现实当前时间
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 14:55:36'
>>>time.strftime("%Y-%m-%d",time.localtime(1500000000))
'2017-07-14'
#字符串时间-->结构化时间
#time.strptime(时间字符串,字符串对应格式)
>>>time.strptime("2017-03-16","%Y-%m-%d")
time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
>>>time.strptime("07/24/2017","%m/%d/%Y")
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
其他用法
time.sleep(3) # 推迟3 秒
二、random模块
import random
#随机小数
>>> random.random() # 大于0且小于1之间的小数
0.7664338663654585
>>> random.uniform(1,3) #大于1小于3的小数
1.6270147180533838
#随机整数
>>> random.randint(1,5) # 大于等于1且小于等于5之间的整数
>>> random.randrange(1,10,2) # 大于等于1且小于10之间的奇数
#随机选择一个返回
>>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#随机选择多个返回,返回的个数为函数的第二个参数
>>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
[[4, 5], '23']
#打乱列表顺序
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打乱次序
>>> item
[5, 1, 3, 7, 9]
>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]
生成随机验证码
# 手机版
import random
s = ''
for i in range(6):
num = str(random.randint(0,9)) # 0 - 9 之间的随机整数转化 str
s += num # 字符串拼接
print(s)
# 网页版
import random
ret = ''
for i in range(6):
num = str(random.randint(0,9))
a_num = random.randint(97,122) # ascii : a - z
a_num2 = random.randint(65,90) # ascii : A - Z
apha = chr(a_num) # 将 ascii :数字转化为字母
apha2 = chr(a_num2) # 将 ascii :数字转化为字母
ret += random.choice([num,apha,apha2]) # 在数字小字母,大字母,随机选择一个返回
# 然后将字符串拼接起来
print(ret)
三、OS模块
这是一个与操作系统交互的接口
- 获取和修改当前工作目录
- 创建或删除文件、文件夹
- 查看不同操作系统的一些符号
- 执行操作系统的命令
-
跨平台操作目录
6.计算文件大小
四、sys模块
五、json模块
序列化模块: 将原本的字典、列表等内容转化成一个字符串的过程就叫序列化,
为什么序列化
1.要固态的储存一个数据结构
2.要在网络上传输一个数据结构
3.是程序更具有维护性
json提供了四个方法: dumps、dump、loads、load
字典、列表、元祖(返回列表,因为他是被当做列表序列化的)
数据结构 ---> json dumps
json ---> 数据结构 loads
import json
dic = {"k":"v"} # 字典
print(dic,type(dic))
print(json.dumps(dic),type(json.dumps(dic)))
s = json.dumps(dic)
print(json.loads(s),type(json.loads(s)))
li = [1,2,3,4] # 列表
print(dic,type(li))
print(json.dumps(li),type(json.dumps(li)))
s = json.dumps(li)
print(json.loads(s),type(json.loads(s)))
li = [1,'asd',[1,2,3,4],{'name':'alex','age':56}] # 可以嵌套其他类型数据
print(json.dumps(li),type(json.dumps(li)))
s = json.dumps(li)
print(json.loads(s),type(json.loads(s)))
tu = (1,2,3,4) # 元组 返回列表
print(tu,type(tu))
print(json.dumps(tu),type(json.dumps(tu)))
s = json.dumps(tu)
print(json.loads(s),type(json.loads(s)))
# 元组和list 非常像,元组是作为一个list 被序列化的,所以转回来以后只能转成一个列表
文件的读和写
dic = {"k":"v"}
# 将字典写入文件
with open('a1.txt','w')as f:json.dump(dic,f)
# 文件中的内容:
{"k": "v"} # str
# 从文件中取读字典
with open('a1.txt') as f1: print(json.load(f1))
{'k': 'v'}
六、hashlib模块
1、什么叫hash:hash是一种算法(这里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值
2、hash值的特点是:
1 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
import hashlib
m=hashlib.md5()# m=hashlib.sha256()
m.update('hello'.encode('utf8'))
print(m.hexdigest()) #5d41402abc4b2a76b9719d911017c592
m.update('alvin'.encode('utf8'))
print(m.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af
m2=hashlib.md5()
m2.update('helloalvin'.encode('utf8'))
print(m2.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af
'''
注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样
但是update多次为校验大文件提供了可能。
'''
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
hash = hashlib.sha256('898oaFs09f'.encode('utf8'))
hash.update('alvin'.encode('utf8'))
print (hash.hexdigest())#e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7
模拟撞库
import hashlib
passwds=[
'alex3714',
'alex1313',
'alex94139413',
'alex123456',
'123456alex',
'a123lex',
]
def make_passwd_dic(passwds):
dic={}
for passwd in passwds:
m=hashlib.md5()
m.update(passwd.encode('utf-8'))
dic[passwd]=m.hexdigest()
return dic
def break_code(cryptograph,passwd_dic):
for k,v in passwd_dic.items():
if v == cryptograph:
print('密码是===>\033[46m%s\033[0m' %k)
cryptograph='aee949757a2e698417463d47acac93df'
break_code(cryptograph,make_passwd_dic(passwds))
模拟撞库破解密码
七、re模块
八、loggin模块
这是一个日志模块
应用场景:
- 程序调试
- 了解软件程序运行情况,是否正常
- 软件程序运行故障分析与问题定位
但是在开发供别人使用的库时,不推荐,因为会引起日志的混乱
import logging
logging.debug('debug message') # 程序里的调试消息。
logging.info('info message') # 获取消息
logging.warning('warning message') # 报警信息
logging.error('error message') # 错误信息
logging.critical('critical message') # 临界信息
从上到下 越来越严重
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于warning级别的日志,这说明默认的日志级别设置为warning(日志级别等级critical > error > warning > info > debug)
调用loggin
import logging
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log',encoding='utf-8')
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
在django项目中的应用
# 控制台打印日志
BASE_LOG_DIR = os.path.join(BASE_DIR, "log") 注意要存在 log 文件夹用于记录错误信息
LOGGING = {
'version': 1, #(版本) 保留的关键字,暂时没有用,以后可能有用
'disable_existing_loggers': False, #(禁用现有记录器) 不禁用已经存在的logger实例
'formatters': { # 定义的日志的格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
'collect': {
'format': '%(message)s'
}
}, # (格式程序)
'filters': {
'require_debug_true': { # 过滤日志的配置项
'()': 'django.utils.log.RequireDebugTrue',
},
}, # ( 过滤器 )
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'SF': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根据文件大小自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 3, # 备份数为3 xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
'formatter': 'standard',
'encoding': 'utf-8',
},
# 'TF': {
# 'level': 'INFO',
# 'class': 'log.handlers.TimedRotatingFileHandler', # 保存到文件,根据时间自动切
# 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
# 'backupCount': 3, # 备份数为3 xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
# 'when': 'D', # 每天一切, 可选值有S/秒 M/分 H/小时 D/天 W0-W6/周(0=周一) midnight/如果没指定时间就默认在午夜
# 'formatter': 'standard',
# 'encoding': 'utf-8',
# },
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "bms_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 500, # 日志大小 500M
'backupCount': 3, # 最多保存多少个日志文件
'formatter': 'standard',
'encoding': 'utf-8', # 写日志文件的编码格式
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
}, # ( 处理程序 )
'loggers': {
'': { # 默认的logger应用如下配置
'handlers': ['SF', 'console', 'error'], # 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True,
},
'collect': { # 名为 'collect'的logger还单独处理
'handlers': ['console', 'collect'],
'level': 'INFO',
}
}, # ( 记录器 )
}