python常用内置模块(内附随机验证码程序、模拟登陆程序“密码为md5密文”)

python常用内置模块

1、time模块

  time模块:普通时间模块

  在python中的三种时间表现形式:

(1)time.time():时间戳:(机器看的)

  从1970.01.01 00:00:00到当前时间,按秒计算,计算了多少秒

  >>> time.time():时间戳,计算时间时需要使用(*****)

# 1.时间戳:计算时间时需要用
import time
print(time.time())

  执行结果:

1602680354.0047967

 

(2)time.strftime():格式化时间(Format String):(人看的)

  返回的是时间的字符串:2020-10-14

  >>> time.strftime():格式化时间,拼接用户时间格式并保存时使用(*****)

# 2.格式化时间:拼接用户时间格式并保存时使用
'''
# 查看源码:
%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].
'''
import time
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 查看当前年月日时分秒 print(time.strftime("%Y-%m-%d %X")) # 查看当前年月日时分秒, %X == %H:%M:%S print(f"现在时间是{time.strftime('%H:%M:%S')},你在哪?")

  执行结果:

2020-10-14 21:08:14
2020-10-14 21:08:14
现在时间是21:08:14,你在哪?

 

(3)格式化时间对象(struct_time):

  返回的是一个元组,元组中有9个值:

  9个值分别代表:年、月、日、时、分、秒、一周中第几天、一年中第几天、夏令时

  >>> time.localtime():获取时间对象

# 3.获取时间对象
import time
time_obj
= time.localtime() print(time_obj.tm_year) print(time_obj.tm_mon) print(time_obj.tm_mday) print(time_obj.tm_hour) print(time_obj.tm_min) print(time_obj.tm_sec)

  执行结果:

2020
10
14
21
16
24

 

  >>> time.struct_time():将时间对象转化为格式化时间

# 4.将时间对象转为格式化时间
import time
res
= time.localtime() # 时间对象 time.sleep(5) print(time.strftime("%Y-%m-%d %H:%M:%S", res)) print(time.strftime("%Y-%m-%d %H:%M:%S"))

  执行结果:

2020-10-14 21:18:40
2020-10-14 21:18:45

 

 

2、datetime模块

  datatime模块:基于time模块封装的更高级的时间模块

(1)datetime.date.today():获取当前年月日(*****)

import datetime
res
= datetime.date.today() print(res)

  执行结果:

2020-10-14

 

(2)datetime.datetime.today():获取当前年月日时分秒(*****)

import datetime
res
= datetime.datetime.today() print(res)

  执行结果:

2020-10-14 21:29:59.411155

 

(3)获取时间对象(*****)

import datetime

time_obj = datetime.datetime.today()    
print(time_obj.year)
print(time_obj.month)
print(time_obj.day)
print(time_obj.hour)
print(time_obj.minute)
print(time_obj.minute)


print(time_obj.weekday())    # 从索引0开始计算周一   0-6
print(time_obj.isoweekday())    # 从索引1开始计算周一   1-7

  执行结果:

2020
10
14
21
32
32
2
3

 

(4)datetime.datetime.utcnow():获取UTC时间(*****)

import datetime
print(datetime.datetime.now()) # 北京时间 print(datetime.datetime.utcnow()) # 格林威治

  执行结果:

2020-10-14 21:35:14.236366
2020-10-14 13:35:14.236366

 

(5)日期计算(*****)

  日期/时间计算:

    日期 = 日期 +/- 时间对象

    时间对象 = 日期时间 +/- 日期时间

import datetime

now_time = datetime.datetime.now()    # 获取现在的时间
time_obj = datetime.timedelta(days=7)    # 获取七天时间对象

# 日期 = 日期 +/- 时间对象
later_time = time_obj + now_time    # 获取当前时间7天后的时间
print(later_time)

# 时间对象 = 日期时间 +/- 日期时间
time_new_obj = later_time - now_time
print(time_new_obj)

  执行结果:

2020-10-21 21:40:09.789771
7 days, 0:00:00

 

 

3、random模块

  random模块:随机模块

(1)random.randint():随机取整值(*****)

  随机从1-10中获取一个整数

import random

res = random.randint(1, 9)
print(res)

  执行结果(多次执行才可看到效果):

7    # 第一次执行
6    # 第二次执行
9 # 第三次执行

 

(2)random.random():默认获取0-1之间的小数

import random

res2 = random.random()
print(res2)

  执行结果(多次执行):

0.28873937658026116    # 第一次执行
0.7381464343010954    # 第二次执行
0.841776539779358    # 第三次执行

 

(3)random.shuffle():将可迭代对象中的值进行乱序,类似于洗牌(不可变类型不可被乱序)

  将list1中元素进行乱序

import random

list1 = ["黑桃A", "红桃A", "梅花A", "方块A", "小王", "大王"]
random.shuffle(list1)
print(list1)

  执行结果(多次执行):

['红桃A', '梅花A', '方块A', '小王', '黑桃A', '大王']    # 第一次执行
['梅花A', '小王', '黑桃A', '方块A', '红桃A', '大王']    # 第二次执行
['红桃A', '小王', '方块A', '梅花A', '黑桃A', '大王']    # 第三次执行

 

(4)random.choice():随机获取可迭代对象中的某一个值(*****)

  随机取出list2中的值

import random

list2 = ["黑桃A", "红桃A", "梅花A", "方块A", "小王", "大王"]
res3 = random.choice(list2)
print(res3)

  执行结果(多次执行):

大王    # 第一次执行
小王    # 第二次执行
红桃A    # 第三次执行

 

 

4、random模块案例:随机验证码

"""
需求:
    1.大小写字母、数字组合而成
    2.自定义位数的随机验证码

前置技术:
    - chr()    # 可以将ASCII表中的值转换成对应的字符
    # print(chr(97))
    - random.choice()
"""

 

  ASCII码对照表(如下图):

 

  写一个随机验证码程序,传入num参数可自定义验证码长度(案例num=4)

import random

# 定义一个获取验证码的主程序
def get_code(num):
    # 定义一个空字符串,为拼接字符做准备
    code = ""
    # 每次循环只从大小写字母、数字中取出一个
    for i in range(num):

        # 随机获取一个小写字母
        res1 = random.randint(97, 122)
        lower_str = chr(res1)

        # 随机获取一个大写字母
        res2 = random.randint(65, 90)
        upper_str = chr(res2)

        # 随机获取一个数字,将数字转化为字符串
        res3 = str(random.randint(0, 9))

        # 将大小写字母、数字放进列表中
        code_list = [lower_str, upper_str, res3]
        # 使用random.choice每次随机取出一个值
        random_code = random.choice(code_list)
        # 将每次取出的值进行拼接
        code += random_code

    # 返回验证码
    return code


# 接受主程序返回的验证码
yzm = get_code(4)
# 打印验证码
print(yzm)

  执行结果(多次执行):

ag47    # 第一次执行
3p9y    # 第二次执行
O71X    # 第三次执行

 

 

5、os模块

  os模块:与操作系统交互的模块

(1)os.path.dirname():获取当前文件的上一级目录

import os

# 获取当前文件中的上一级文件夹目录
LAST_DIR = os.path.dirname(__file__)
print(LAST_DIR)

# 项目的根目录,路径相关的值都用“常量”。常量一般都用大写,无需修改的变量
BASE_PATH = os.path.dirname(LAST_DIR)
print(BASE_PATH)

  执行结果:

F:/python/python/demo
F:/python/python

 

(2)os.path.join():路径拼接,拼接目录的绝对路径

import os

LAST_DIR = os.path.dirname(__file__)
TEST_PATH = os.path.join(LAST_DIR, "test.txt")
print(TEST_PATH)

  执行结果:

F:/python/python/demo\test.txt

 

(3)os.path.exists():判断文件/文件夹是否存在:若存在返回True,不存在返回False

  os.path.isdir():判断文件夹是否存在

import os

LAST_DIR = os.path.dirname(__file__)
BASE_PATH = os.path.dirname(LAST_DIR)
TEST_PATH = os.path.join(LAST_DIR, "test.txt")

# 判断文件/文件夹是否存在
print(os.path.exists(TEST_PATH))    # False
print(os.path.exists(BASE_PATH))    # True

# 判断文件夹是否存在
print(os.path.isdir(TEST_PATH))    # False
print(os.path.isdir(BASE_PATH))    # True

  执行结果:

False
True
False
True

 

(4)os.mkdir():创建文件夹

  os.rmdir():删除文件夹,只能删除空文件夹

import os

# 创建文件夹
DIR_PATH = os.path.join(LAST_DIR, "test")
os.mkdir(DIR_PATH)

# 删除文件夹:只能删除空文件夹
os.rmdir(DIR_PATH)

 

(5)os.listdir():获取某个文件夹下所有文件的名字,返回一个列表

import os

dir_list = (os.listdir(r"F:\python\python\demo"))
print(dir_list)

  执行结果:

['test.txt', 'test2', 'test3.py', 'test4.txt']

 

 

6、os模块案例:让用户选择文件,并打印出文件内容

  补充:enumerate("可迭代对象", start=)   --->  得到一个对象,对象中有一个个元组

  enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据序号

import os

dir_list = (os.listdir(r"F:\python\python\demo"))
res = enumerate(dir_list, start=1)
print(list(res))

  执行结果:

[(1, 'test.txt'), (2, 'test2'), (3, 'test3.py'), (4, 'test4.txt')]

 

  主程序:

import os

dir_list = (os.listdir(r"F:\python\python\demo"))
res = enumerate(dir_list)

while True:
    # 1.打印所有的文件名
    for index, name in enumerate(dir_list, start=1):
        print(f"序号为{index},文件为{name}")

    choice = input("请输入>>> ").strip()

    # 2.限制用户必须输入数字,数字范围必须在编号内
    # 如果不是数字,请重新输入
    if not choice.isdigit():
        print("必须输入数字...")
        continue

    # 若是数字,往下走继续判断是否在编号内
    choice = int(choice)

    # 如果不在列表中,重新选择
    if choice not in range(len(dir_list)):
        print("编号输入错误...")
        continue

    filename = dir_list[choice]

    file_path = os.path.join(
        r"F:\python\python\demo", filename)

    with open(file_path, "r", encoding="utf-8") as f:
        print(f.read())

  执行结果:

序号为1,文件为test.txt
序号为2,文件为test2
序号为3,文件为test3.py
序号为4,文件为test4.txt
请输入>>> 4
hi, so cool

 

 

7、sys模块

  sys模块:与python解释器交互的模块

(1)sys.path获取当前的python解释器环境变量

import sys

print(sys.path)

  执行结果:

['F:\\python\\python\\demo', 'F:\\python\\python', 'F:\\python\\path\\JetBrains\\PyCharm 2020.1\\plugins\\python\\helpers\\pycharm_display', 'F:\\python\\python\\python\\Scripts\\python37.zip', 'F:\\python\\path\\Python3.7.0\\DLLs', 'F:\\python\\path\\Python3.7.0\\lib', 'F:\\python\\path\\Python3.7.0', 'F:\\python\\python\\python', 'F:\\python\\python\\python\\lib\\site-packages', 'F:\\python\\path\\JetBrains\\PyCharm 2020.1\\plugins\\python\\helpers\\pycharm_matplotlib_backend']

 

(2)sys.path.append():将当前项目添加到环境变量中(*****)

  解释器的环境变量:模块与包的查找顺序

import sys
import os

BASE_PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_PATH)

 

(3)sys.argv:获取cmd终端的命令行

print(sys.argv)    # 返回的是列表['']

  执行结果:

['F:/python/python/demo/sys模块.py']

 

 

8、hashlib模块

  hashlib模块:加密模块

    明文密码:123456 ---> 123456

    密文密码:123456 --->  e10adc3949ba59abbe56e057f20f883e

  内置算法:

    MD5(*****):不可解密的算法(2018年以前)

 

  案例1:将123转化为MD5密码:

"""
# hashlib.md5()源码:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
"""



import hashlib

str1 = "123"
md5_obj = hashlib.md5()    # 得到一个md5 hash对象

# update中一定要传入bytes类型数据,所以要将传入的字符串进行编码
md5_obj.update(str1.encode("utf-8"))

# 得到一个123加密后的md5密文密码
res = md5_obj.hexdigest()
print(res)

  执行结果:

202cb962ac59075b964b07152d234b70

 

  案例2:案例1的操作,撞库(暴力破解)有可能会破解真实密码,为了防止暴力破解:“加盐”:相当于在原来的md5密文密码外又套了一层md5密文密码

import hashlib

str1 = "123"
md5_obj = hashlib.md5()

# update中一定要传入bytes类型数据,所以要将传入的字符串进行编码
md5_obj.update(str1.encode("utf-8"))    # 202cb962ac59075b964b07152d234b70

# 创造盐
sal = "so cool"

# 加盐操作
md5_obj.update(sal.encode("utf-8"))

# 得到一个加密后的字符串
res = md5_obj.hexdigest()    # 86af03ea057db1711907de32695a3509
str2 = f"yangy:{res}"    # 将用户名密码拼接,用户名:yangy,密码:123(文件中将要存的密码是123的md5密文密码“加盐”之后的md5密文密码)

# 用户名和密文密码保存到文件中 with open(
"user.txt", "w", encoding="utf-8") as f: f.write(str2)

 

9、hashlib模块案例:模拟登陆(密码为md5密文)

  案例3:在8.案例2的基础下,写一个模拟登陆程序

# 模拟用户登录操作
import hashlib

# 定义获取md5密文密码的函数
def get_md5(pwd):
    md5_obj = hashlib.md5()    # 获得一个md5 hash对象
    # update中一定要传入bytes类型数据,所以要将传入的字符串进行编码
    md5_obj.update(pwd.encode("utf-8"))
    # 创造“盐”,这个“盐”一定要与创建md5密文密码时候的“盐”一致
    sal = "so cool"
    # “加盐”
    md5_obj.update(sal.encode("utf-8"))
    # 返回一个加密后的md5密文字符串
    res = md5_obj.hexdigest()
    return res

# 定义登录认证主程序
def login_auth():
    # 读取密码文件中的用户数据
    with open("user.txt", "r", encoding="utf-8") as f:
        info = f.readline()

    # 解压赋值获取文件中的用户名和md5密文密码
    file_user, file_pwd = info.split(":")

    # 用户输入用户名密码
    username = input("请输入账户:").strip()
    password = input("请输入密码:").strip()

    # 判断用户输入的用户和密码与文件中的是否相符
    if username == file_user and get_md5(password) == file_pwd:    # get_md5(用户输入的密码)
        print("登陆成功!")
    else:
        print("登录失败!")


# 执行登录认证主程序,用户名:yangy,密码:123
login_auth()

 

  执行结果:错误输入用户名密码

 

  执行结果:正确输入用户名密码

posted @ 2020-10-14 22:54  chchcharlie、  阅读(429)  评论(0编辑  收藏  举报