Title

python内几种常用内置模块的介绍,包括time模块,datetime模块,random模块,os模块,sys模块,hashlib模块

 

介绍Python中的几种常用模块

1.time模块

与时间处理有关的python内置模块

  • 时间戳:自1970-01-01 00.00:00到当前时间,按秒计算,到现在为止一共多少秒

import time    # 导入时间模块包
import time
print(time.time())     # 获取当前时间的时间戳
'''
1573887905.6273756
'''

print(time.localtime())    # 获取当地时间格式化对象,即struct.time(为九个元素的元组)
'''
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=16, tm_hour=15,tm_min=5, tm_sec=5, tm_wday=5, tm_yday=320, tm_isdst=0)
'''


res = time.localtime()
print(res.tm_hour)
print(res.tm_mday)
# 可以将时间元素返回出来
15
16

print(time.gmtime())
# ,将一个时间转化为UTC时区(0时区)的struct.time,# 即获取格林威治时间格式化对象
'''
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=16, tm_hour=7, \
tm_min=5, tm_sec=5, tm_wday=5, tm_yday=320, tm_isdst=0)

'''
# print(time.strftime())
# strftime()可以把一个代表的时间的元组或struct_time转化为格式化的时间字符串,若t未指定,则以当前时间为参数
#格式参考下方官方指定
print(time.strftime('%Y-%m-%d %H:%M:%S'))

# 2019-11-16 15:34:30

print(time.strftime('%Y-%m-%d %X'))  
# %H:%M:%S = %X
# 2019-11-16 15:34:30

"""
  %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].
  %z Time zone offset from UTC.
  %a Locale's abbreviated weekday name.
  %A Locale's full weekday name.
  %b Locale's abbreviated month name.
  %B Locale's full month name.
  %c Locale's appropriate date and time representation.
  %I Hour (12-hour clock) as a decimal number [01,12].
  %p Locale's equivalent of either AM or PM.

"""

print(time.strptime('2018-10-05 11:10:10','%Y-%m-%d %H:%M:%S'))
# 把一个格式化的时间转化成格式化时间对象(struct_time)
# strptime和strftime是互逆操作

# time.struct_time(tm_year=2018, tm_mon=10, tm_mday=5, \
# tm_hour=11, tm_min=10, tm_sec=10, tm_wday=4, tm_yday=278, tm_isdst=-1)



# time.sleep('参数')
# 里面的参数指的是秒,可以将程序延长到参数所指定的时间后再执行


print(time.asctime())
# 将一个时间的元组或者或者struct_time表示为下面这种形式,不传参数则默认为当前时间
'''
Sat Nov 16 15:14:11 2019
'''


print(time.ctime())
print(time.ctime(1573887905.6273756))
# 将时间戳改为下面这种形式,不传参则默认为当前时间戳
'''
Sat Nov 16 15:18:05 2019
Sat Nov 16 15:05:05 2019
'''

2.datetime模块

和时间有关的python内置模块

import datetime


print(datetime.date.today())   # 获取当前日期
# 2019-11-16

print(datetime.datetime.today())  # 获取当前日期时间 (北京时间)

# 2019-11-16 16:16:35.420231

print(datetime.datetime.now())    # 获取当前日期时间,和上面的方法没有多少区别

# 2019-11-16 16:16:35.420231


print(datetime.datetime.utcnow())  # 格林威治时间

# 2019-11-16 08:16:35.420231

res = datetime.datetime.today()
print(res.hour)   # 可以提取时
# 16
print(res.year)   # 可以提取年
# 2019
print(res.month)   # 可以提取月


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

# 当前时间
current_time = datetime.datetime.now()
print(current_time)

# 2019-11-16 16:48:58.950441

# 时间对象
# 一段时间间隔后的时间
datetime_obj = datetime.timedelta(days = 3)
print(datetime_obj)

# 3 days, 0:00:00

# 获取当前时间3天后的时间
# 日期时间 = 当前时间 “+” or “-” 时间对象
late_time = current_time + datetime_obj

print(late_time)

# 2019-11-19 16:48:58.950441

# 时间对象 = 日期时间 - 当前时间

datetime_obj = late_time - current_time
print(datetime_obj)

# 3 days, 0:00:00

3.random模块

随机数模块

import random

print(random.randrange(1,10))   # 返回一个1到10内的随机数,但是取不到10

print(random.randint(1,10))   # 返回一个1到10内的随机数,可以取到10

print(random.randrange(0,10,2))   # 返回一个0到10内的随机偶数,后面的2表示步长

print(random.random())   # 随机返回一个1以内的浮点数

l1 = [1, 2, 3, 4, 5, 6]

random.shuffle(l1)    # 将原序列(只有列表可以)打乱顺序重新随机排列,又叫洗牌

print(l1)


l2 = [2,4,5,7,9,]     # 在给定序列(有索引的可迭代对象,list,tuple)中随机抽一个字符,集合和字典不能随机选取
# l3 = {1,2,3,4,5}
# l4 = {'a':1,'b':2,'c':3}
l5 = (1,2,3,4,5)
print(random.choice(l2))
# print(random.choice(l3))
# print(random.choice(l4))
print(random.choice(l5))


l =  random.sample('jsdiand',3)  # 从给定的字符串组中随机抽取特定数量的字符,并返回列表

print(l)



# 可以做一个简单的验证码
n = 0
l1 = ''
while n < 5 :
   a = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
   s = random.sample(a,1)  # 从a中随机选出一个值,返回的是列表
   for i in s:   # 将字符串取出来
       l1 += i   # 拼接字符串
   n += 1
random.shuffle(list(l1))   # 再洗一次牌
print(l1)



b = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
c = random.sample(b, 10)
for i in c:
   print(i)


'''
需求:
  大小写字母、数字组合而成
  组合5位数的随机验证码

前置技术:
    random.randint(1,10)  # 在1到10中随机选出一个数
  - chr(97) # 可以将ASCII表中值转换成对应的字符
  # print(chr(101))
  - random.choice
'''

# chr(97) 可以将ASCII码中的值转换成对应的字符
# 获取任意长度的随机验证码
def get_code(n):
   code = ''
   # 每次循环只从大小写字母、数字中取出一个字符
   # for line in range(5):
   for line in range(n):

       # 随机获取一个小写字母
       res1 = random.randint(97, 122)
       lower_str = chr(res1)  
       # lower = chr(random.randint(97,122))
       # 两句可以合并一句

       # 随机获取一个大写字母
       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(5)
print(code)
print(len(code))

4.os模块

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

import os


DAY15_PATH = os.path.dirname(__file__)
# # 默认获取此文件的上一层目录的绝对路径
print(DAY15_PATH)

'''
输出结果:G:/python/day15
'''

# 项目的根目录,路径相关的值都用 “常量”
BASE_PATH = os.path.dirname('G:\python\day15\时间模块.py')
BASE_PATH1 = os.path.dirname('G:\python\day15')
print(BASE_PATH)    # 返回上一级根目录
print(BASE_PATH1)


'''输出结果
G:/python/day15
G:\python\day15   # 正反斜杠没有影响
G:\python
'''


# 路径的拼接
DAY15_PATH = os.path.dirname(__file__)
print(os.path.join('G:\python\day15','python之从入门到放弃.txt'))
print(os.path.join(DAY15_PATH,'python之从入门到放弃.txt'))

'''
# 输出结果:
# G:\python\day15\python之从入门到放弃.txt
# G:/python/day15\python之从入门到放弃.txt
'''



# 通过路径判断文件/文件夹是否存在,存在返回True,不存在返回False

print(os.path.exists('G:\python\day15\python之从入门到放弃.txt'))

print(os.path.exists('G:\python\day15\python之从入门.txt'))

'''
# True
# False
'''
# 判断“文件夹”是否存在,存在返回True,不存在返回False
print(os.path.isdir('G:\python\day15'))  # True

# 判断文件是否存在
print(os.path.isfile('G:\python\day15\python之从入门到放弃.txt'))
   
   
#创建文件夹
DAY_15 = os.path.dirname(__file__)
DIR_PATH = os.path.join(DAY_15, 'python练习册')
os.mkdir(DIR_PATH)        # 创建文件夹

# 删除文件夹: 只能删除 “空的文件夹”
os.rmdir("G:\python\day15\python练习册")


# 获取某个文件夹中所有文件的名字
teacher_list = os.listdir(r'G:\python\day15')
print(teacher_list)    # 返回的是列表格式

# enumerate(可迭代对象) ---> 得到一个对象,对象中有一个个的元组(索引, 元素),若是字典取出所有的key
res = enumerate(teacher_list)
print(res)   # 得到的是一个对象 <enumerate object at 0x0000023DA0ED0C78>

print(list(res))  # 将对象改成元组并标有序号
# [(0, 'datetime时间模块.py'), (1, 'os模块.py'), (2, 'python之从入门到放弃.txt'), \
# (3, 'python练习册'), (4, 'random模块.py'), (5, 'sys模块.py'), \
# (6, '__init__.py'), (7, '时间模块.py'), (8, '验证15.py')]

举例:1让用护从文件夹中选择文件并打开
# 让用户选择文件
while True:

# 获取某个文件夹中所有文件的名字
   teacher_list = os.listdir(r'G:\python\day15')
 
# 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'G:\python\day15\老男孩老师们的写真集', file_name)

   print(teacher_path)

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





举例2
import os  # 导入os模块
while True:
   # 找到这个文件夹(电影大全)
   DATE_PATH = os.path.dirname(os.path.dirname(__file__))  # 需要往上找两次才能在同一根目录下
   DATE_AIM_PATH = os.path.join(DATE_PATH, '电影大全')
   # 获取电影大全文件夹中的所有名字
   movie_list = os.listdir(DATE_AIM_PATH)     # 获得文件下的电影列表
   for index,name in enumerate(movie_list):   # 解压赋值
       print(f"编号:{index},电影名:{name}")     # 打印出来编号和文件名
   choice = input('请选择想要观看的电影编号:').strip()
   if not choice.isdigit():
       print("必须写入数字")      # 判断输入的是否是数字
       continue
   choice = int(choice)      # 将输入的字符串数字改为整型
   if choice not in range(len(movie_list)):  # 判断数字是否在编号范围内
       print("没有此电影")
       continue
   file_name = movie_list[choice]  # 索引到此文件名
   movie_path = os.path.join(DATE_AIM_PATH,file_name)  # 拼接文件路径
   print(movie_path)    # 打印文件路径
   with open(movie_path,'r',encoding='utf-8')as f:   # 读取文件内容
       print(f.read())

     
   # os模块的getpid()可以获得该进程的进程号,os.ppid()可以获得该进程的父进程的进程号

5.sys模块

sys模块是和python解释器交互的模块

import sys
import os

# 获取当前的Python解释器的环境变量路径,返回的是列表
# print(sys.path)

# 将当前项目添加到环境变量中
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_PATH)

# 获取操作系统cmd终端的命令行  
# 执行==vpython3 py文件 用户名 密码
print(sys.argv)  # 返回的是列表['']
res = sys.argv

if res[1] == 'jiang' and res[2] == '123': # 判断cmd输入的用户名和密码是否正确,进行权限认证
   print('您已通过验证')
else:
   print('权限不足')
   
   
(执行py文件的权限认证)

os._exit() 和 sys.exit()
os._exit() vs sys.exit()
概述

python的程序有两中退出方式:os._exit(), sys.exit()。本文介绍这两种方式的区别和选择。

os._exit()会直接将python程序终止,之后的所有代码都不会继续执行。

sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那么python解释器将会退出。如果有捕获此异常的代码,那么这些代码还是会执行。捕获这个异常可以做一些额外的清理工作。0为正常退出,其他数值(1-127)为不正常,可抛异常事件供捕获。

举例说明

#!/usr/local/bin/env python
import os, sys

try:
    sys.exit(0)
except:
    print('die')
finally:
    print('cleanup')

try:
    os._exit(0)
except:
    print('die')
    print('os.exit')#不打印直接退出了

 

综上,sys.exit()的退出比较优雅,调用后会引发SystemExit异常,可以捕获此异常做清理工作。os._exit()直接将python解释器退出,余下的语句不会执行。

一般情况下使用sys.exit()即可,一般在fork出来的子进程中使用os._exit()

一般来说os._exit() 用于在线程中退出
sys.exit() 用于在主线程中退出。

exit() 跟 C 语言等其他语言的 exit() 应该是一样的。
os._exit() 调用 C 语言的 _exit() 函数。

builtin.exit 是一个 Quitter 对象,这个对象的 call 方法会抛出一个 SystemExit 异常。

exit(0)和exit(1)
exit(0):无错误退出
exit(1):有错误退出
退出代码是告诉解释器的(或操作系统)

6.hashlib模块

hashlib模块内置有很多算法,可以用来加密字符

import hashlib
'''
hashlib模块是一种加密模块,模块里面包含了很多算法
比如MD5,sha256等
其中我们常用的是MD5算法,因为其不可解的特性被广泛用于密码验证等


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

  - 密文密码就是一个摘要


'''
# md5_obj = hashlib.md5()
# print(type(md5_obj))

# 输出结果:<class '_hashlib.HASH'>

# md5_obj = hashlib.md5
# print(type(md5_obj))
# 输出结果 <class 'builtin_function_or_method'>
#


md5_obj = hashlib.md5()
str_1 = '1234'
# update中一定要传入bytes类型
md5_obj.update(str_1.encode('utf-8'))    # 产生了一个内存地址
# 得到一个加密的字符串
res = md5_obj.hexdigest()  # 此时加密的是str_1字符串
print(res)
# # 输出结果:81dc9bdb52d04dc20036dbd8313ed055

# str_1 = '1234'
# hashlib.md5().update(str_1.encode('utf-8')) # 产生了一个内存地址
# print(hashlib.md5().hexdigest())   # 再次调用再次产了一个内存地址,所以没有引用到str_1,加密的是个空字符串
#
# 输出结果:d41d8cd98f00b204e9800998ecf8427e

print(hashlib.md5().hexdigest())    # 加密的一个空字符串

# 输出结果:d41d8cd98f00b204e9800998ecf8427e

   
'''
虽然md5几乎不会不破解,但是可以通过撞库的方式破解真实密码
为了防止撞库,我们可以通过'加盐'的方式来解决
'''
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()

   return res


# 模拟用户登陆操作

# 获取文件中的用户名与密码
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('登陆失败')

 

 

posted @ 2019-11-17 22:56  Mr江  阅读(427)  评论(0编辑  收藏  举报