美文网首页
常用的模块

常用的模块

作者: 鬼泣_89b6 | 来源:发表于2019-04-02 18:08 被阅读0次

    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',
            }
        },  # ( 记录器 )
    }
    

    相关文章

      网友评论

          本文标题:常用的模块

          本文链接:https://www.haomeiwen.com/subject/owugbqtx.html