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

python

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	est.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:pythonpythondemo"))

print(dir_list)

  执行结果:

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

 

 

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

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

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

import os

dir_list = (os.listdir(r"F:pythonpythondemo"))

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:pythonpythondemo"))

res = enumerate(dir_list)

while True:

# 1.打印所有的文件名

for index, name in enumerate(dir_list, start=1):

print(f"序号为{index},文件为{name}")

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

# 2.限制用户必须输入数字,数字范围必须在编号内

# 如果不是数字,请重新输入

ifnot choice.isdigit():

print("必须输入数字...")

continue

# 若是数字,往下走继续判断是否在编号内

choice = int(choice)

# 如果不在列表中,重新选择

if choice notin range(len(dir_list)):

print("编号输入错误...")

continue

filename = dir_list[choice]

file_path = os.path.join(

r"F:pythonpythondemo", 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:pythonpythondemo", "F:pythonpython", "F:pythonpathJetBrainsPyCharm 2020.1pluginspythonhelperspycharm_display", "F:pythonpythonpythonScriptspython37.zip", "F:pythonpathPython3.7.0DLLs", "F:pythonpathPython3.7.0lib", "F:pythonpathPython3.7.0", "F:pythonpythonpython", "F:pythonpythonpythonlibsite-packages", "F:pythonpathJetBrainsPyCharm 2020.1pluginspythonhelperspycharm_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()

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

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

以上是 python常用内置模块(内附随机验证码程序、模拟登陆程序“密码为md5密文”) 的全部内容, 来源链接: utcz.com/z/530166.html

回到顶部