zoukankan      html  css  js  c++  java
  • python基础语法11 内置模块time,datatime,random,os,sys,hashlib模块

    time模块

    在python的三种时间表现形式:
      1.时间戳: 给电脑看的。
        - 自1970-01-01 00:00:00到当前时间,按秒计算,计算了多少秒。

      2.格式化时间(Format String): 给人看的
        - 返回的是时间的字符串 2002-01-11

      3.格式化时间对象(struct_time):
        - 返回的是一个元组, 元组中有9个值:
          9个值分别代表: 年、月、日、时、分、秒、一周中第几天,一年中的第几天,夏令时(了解)

    import time
    
    # 1.获取时间戳(******)计算时间时使用
    print(time.time())  # (*******)1573887159.1747248
    # 2.获取格式化时间 (*******)拼接用户时间格式并保存时使用
    # 获取年月日
    print(time.strftime('%Y-%m-%d'))
    
    # 获取年月日时分秒
    print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2019-11-16 14:50:08
    # %X == %H:%M:%S
    print(time.strftime('%Y-%m-%d %X')) ## 2019-11-16 14:50:08
    print(time.strftime('%X'))         #14:54:25
    
    # 获取年月
    print(time.strftime('%Y/%m'))
    3.获取时间对象 (****print(time.localtime())
    # time.struct_time(tm_year=2019, tm_mon=11, tm_mday=16, tm_hour=14, tm_min=56, tm_sec=15, tm_wday=5, tm_yday=320, tm_isdst=0)
    print(type(time.localtime()))   # <class 'time.struct_time'>
    time_obj=time.localtime()
    print(time_obj.tm_year) # 2019
    print(time_obj.tm_mon)  # 11
    res=time.localtime()
    time.sleep(5)
    
    #获取系统当前时间的格式化时间
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
    # 2019-11-16 15:09:31
    # 将时间对象转为格式化时间
    print(time.strftime('%Y-%m-%d %H:%M:%S',res))
    # 2019-11-16 15:09:26
    
    # 将字符串格式的时间转为时间对象
    res=time.strptime('2019-01-01','%Y-%m-%d')
    print(res)
    # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=1, tm_isdst=-1)

    datetime模块

    import datetime
    
    # 获取当前年月日
    print(datetime.date.today()) # (*******) 2019-11-16
    #
    # # 获取当前年月日时分秒
    print(datetime.datetime.today()) # (*******) 2019-11-16 15:25:03.590939
    #
    time_obj = datetime.datetime.today()
    print(type(time_obj))
    print(time_obj.year)
    print(time_obj.month)
    print(time_obj.day)
    #
    # # 从索引0开始计算周一
    # UTC
    print(time_obj.weekday())  # 0-6
    # ISO
    print(time_obj.isoweekday())  # 1-7
    
    # UTC时区
    # 北京时间
    print(datetime.datetime.now()) # (*******)
    # 格林威治
    print(datetime.datetime.utcnow())

    日期/时间的计算 (*******)
      日期时间 = 日期时间 “+” or “-” 时间对象
      时间对象 = 日期时间 “+” or “-” 日期时间

    # 日期时间:
    current_time = datetime.datetime.now()
    print(current_time)    # 2019-11-16 16:16:40.990100
    
    # 时间对象
    # 获取7天时间
    time_obj = datetime.timedelta(days=7)
    print(time_obj)    #7 days, 0:00:00
    
    # 获取当前时间7天后的时间
    # 日期时间 = 日期时间 “+” or “-” 时间对象
    later_time = current_time + time_obj
    print(later_time)    #2019-11-23 16:16:40.990100
    
    # 时间对象 = 日期时间 “+” or “-” 日期时间
    time_new_obj = later_time - current_time
    print(time_new_obj)    #7 days, 0:00:00

    random模块

    import random
    
    #随机获取1—9中任意的整数
    res = random.randint(1, 9)
    print(res)
    
    #默认获取0——1之间任意小数
    res2 = random.random()
    print(res2)
    
    #洗牌
    #将可迭代中的值进行乱序
    list1 = ['红桃A', '梅花A', '红桃Q', '方块K']
    random.shuffle(list1) # 注意: 不可变类型不可被乱序

     # - list
      #可以对某个有索引的可迭代对象进行乱序

    print(list1)   # ['方块K', '红桃A', '红桃Q', '梅花A']
    
    #随机获取可迭代对象中的某一个值  
    #random.choice(可迭代对象): 注意: 有索引的可迭代对象
    # - list, tuple
    list1 = ['红桃A', '梅花A', '红桃Q', '方块K'] res3 = random.choice(list1) print(res3) # 方块K
    # 需求: 随机验证码
    '''
    需求: 
        大小写字母、数字组合而成
        组合5位数的随机验证码
        
    前置技术:
        - chr(97)  # 可以将ASCII表中值转换成对应的字符
        # print(chr(101))
        - random.choice
    '''
    
    
    # 获取任意长度的随机验证码
    def get_code(n):
        code = ''
        # 每次循环只从大小写字母、数字中取出一个字符
        # for line in range(5):
        for line in range(n):
    
            # 随机获取一个小写字母
            res1 = random.randint(97, 122)
            lower_str = chr(res1)
    
            # 随机获取一个大写字母
            res2 = random.randint(65, 90)
            upper_str = chr(res2)
    
            # 随机获取一个数字
            number = str(random.randint(0, 9))
    
            code_list = [lower_str, upper_str, number]
    
            random_code = random.choice(code_list)
    
            code += random_code
    
        return code
    
    
    code = get_code(100)
    print(code)
    print(len(code))

    OS模块

    os与操作系统交互的模块

    import os
    
    # 需求: 获取当前项目根目录
    
    # 获取当前文件中的上一级目录
    DAY15_PATH = os.path.dirname(__file__)
    print(DAY15_PATH)   #D:/oldboy_edu/python_code/day15
    #
    # # 项目的根目录,路径相关的值都用 “常量”
    BASE_PATH = os.path.dirname(DAY15_PATH)
    print(BASE_PATH)
    #
    # # 路径的拼接: 拼接文件 “绝对路径”
    TEST_PATH = os.path.join(DAY15_PATH, '老男孩老师们的写真集.txt')
    print(TEST_PATH) # D:/oldboy_edu/python_code/day15老男孩老师们的写真集.txt
    #拼接路径,反斜杠没事,程序会根据电脑系统(window/linux)自动调整
    #
    # # 判断“文件/文件夹”是否存在:若文件存在返回True,若不存在返回False
    print(os.path.exists(TEST_PATH))  # True
    print(os.path.exists(DAY15_PATH))  # True
    #
    # # 判断“文件夹”是否存在
    print(os.path.isdir(TEST_PATH))  # False
    print(os.path.isdir(DAY15_PATH))  # True
    #
    # # 创建文件夹
    DIR_PATH = os.path.join(DAY15_PATH, '老男孩老师们的写真集')
    os.mkdir(DIR_PATH)
    
    # 删除文件夹: 只能删除 “空的文件夹”
    os.rmdir(DIR_PATH)
    
    # os.remove('D:/oldboy_edu/python_code/day15/老男孩老师们的写真集.txt') #删除文件
    # 获取某个文件夹中所有文件的名字
    teacher_list = os.listdir(r'D:项目路径python13期day15老男孩老师们的写真集')
    print(teacher_list)   # ['egon.txt', 'sean.txt', 'tank.txt']
    
    # enumerate(可迭代对象) ---> 得到一个对象,对象有一个个的元组(索引, 元素)
    # 注意: 可迭代對象中若是字典,则取字典中所有的key

      #返回的enumerate对象 ---> 相当于迭代器对象
      #list(迭代器对象) ---> 列表

    res = enumerate(teacher_list)   # [(0, 'egon.txt'), (1, 'sean.txt'), (2, 'tank.txt')]
    print(list(res))
    
    # 让用户选择文件
    while True:
        # 1.打印所有老师的作品
        for index, name in enumerate(teacher_list):
            print(f'编号: {index} 文件名: {name}')
    
        choice = input('请选择想看的老师作品-->(头条影片: Jason写真) 编号:').strip()
    
        # 2.限制用户必须输入数字,数字的范围必须在编号内
        # 若不是数字,则重新选择
        if not choice.isdigit():
            print('必须输入数字')
            continue
    
        # 若是数字,往下走判断是否在编号范围内
        choice = int(choice)
    
        # 判断如果不在列表范围内,则重新选择
        if choice not in range(len(teacher_list)):
            print('编号范围错误!')
            continue
    
        file_name = teacher_list[choice]
    
        teacher_path = os.path.join(
            r'D:项目路径python13期day15老男孩老师们的写真集', file_name)
    
        print(teacher_path)
    
        with open(teacher_path, 'r', encoding='utf-8') as f:
            print(f.read())

    sys模块

    import sys
    import os
    
    # 获取当前的Python解释器的环境变量路径
    print(sys.path)
    
    # 将当前项目添加到环境变量中
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_PATH)
    import sys
    import os
    
    # 获取当前的Python解释器的环境变量路径
    print(sys.path)
    
    print('==' * 100)
    # 将当前项目添加到环境变量中
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_PATH)
    print(sys.path)
    print('==' * 100)
    
    # 获取cmd终端的命令行  python3 py文件 用户名 密码
    print(sys.argv)  # 返回的是列表['py文件', '用户名', '密码']
    
    cmd_list = sys.argv
    
    # 执行文件权限认证
    if cmd_list[1] == 'ldc' and cmd_list[2] == '123':
        print('通过验证')
        print('开始执行逻辑代码')
    
    else:
        print('用户名或密码错误,权限不足!')

     

     

     hashlib模块

    - sha_256(了解)
    hashlib是一个加密模块:
      内置了很多算法
      - MD5(*******): 不可解密的算法(2018年以前)

      摘要算法:
        - 摘要是从某个内容中获取的加密字符串
        - 摘要一样,内容就一定一样: 保证唯一性

        - 密文密码就是一个摘要

    import hashlib
    
    md5_obj = hashlib.md5()
    # print(type(md5_obj))
    str1 = '123'
    # update中一定要传入bytes类型数据
    md5_obj.update(str1.encode('utf-8'))
    
    # 得到一个加密后的字符串
    res = md5_obj.hexdigest()
    # 202cb962ac59075b964b07152d234b70
    print(res)
    
    # 以上操作撞库有可能会破解真实密码
    # 防止撞库问题: 加盐
    import hashlib
    
    
    def pwd_md5(pwd):  #
        md5_obj = hashlib.md5()
        # print(type(md5_obj))
        str1 = pwd  # '1234'
        # update中一定要传入bytes类型数据
        md5_obj.update(str1.encode('utf-8'))
    
        # 创造盐
        sal = '坦克怎么这么帅啊!'
        # 加盐
        md5_obj.update(sal.encode('utf-8'))
    
        # 得到一个加密后的字符串
        res = md5_obj.hexdigest()
        # eb1ca06cf5940e9fb6ef39100ec72c94
        return res
    
    user_str2 = f'tank:{res}'
    
    with open('user.txt', 'w', encoding='utf-8') as f:
        f.write(user_str2)
    
    # 模拟用户登陆操作
    
    # 获取文件中的用户名与密码
    with open('user.txt', 'r', encoding='utf-8') as f:
        user_str = f.read()
    
    file_user, file_pwd = user_str.split(':')
    
    # 用户输入用户名与密码
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()  # 1234
    
    # 校验用户名与密码是否一致
    if username == file_user and file_pwd == pwd_md5(password):  # pwd_md5('1234')
        print('登陆成功')
    else:
        print('登陆失败')
  • 相关阅读:
    Selenium WebDriver基础操作教程
    C# 运行cmd 并 执行命令语句
    【JAVA习题二】判断101-200之间有多少个素数,并输出所有素数。
    【JAVA习题一】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    【JAVA随摘笔记一】进制转换
    【C++初学者自学笔记三】哑元函数、缺省参数、内联函数(模块二,PS:需要用到重载函数)
    【C++初学者自学笔记二】函数重载(模块一)
    【JAVA蓝桥杯】基础练习2 十六进制转十进制
    【JAVA蓝桥杯】基础练习1 十进制转十六进制
    【C++初学者自学笔记一】(把自己刚学到的东西做一下总结,如果有哪些地方不足请留言指正)
  • 原文地址:https://www.cnblogs.com/ludingchao/p/11873655.html
Copyright © 2011-2022 走看看