常用的模块

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模块

这是一个与操作系统交互的接口

  1. 获取和修改当前工作目录
  2. 创建或删除文件、文件夹
  3. 查看不同操作系统的一些符号
  4. 执行操作系统的命令
  5. 跨平台操作目录
    6.计算文件大小


    图1

    图2

    图3

四、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模块

这是一个日志模块
应用场景:

  1. 程序调试
  2. 了解软件程序运行情况,是否正常
  3. 软件程序运行故障分析与问题定位
    但是在开发供别人使用的库时,不推荐,因为会引起日志的混乱
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',
        }
    },  # ( 记录器 )
}

你可能感兴趣的:(常用的模块)