Python 常用模块之时间模块、random模块、os模块、sys模块

93 阅读8分钟

一、时间模块

time模块与datetime模块的基本操作

  1. time模块(import time)

    时间分为三种格式:
    • 时间戳:从1970年到现在经过的秒数,用于时间间隔的计算
      print(time.time())  # 1629612171.127616
      
    • 按照某种格式显示的时间,用于展示时间
      print(time.strftime('%Y-%m-%d %H:%M:%S %p'))  # 2021-08-22 14:02:01 PM
      print(time.strftime('%Y-%m-%d %X'))  # 2021-08-22 14:02:01
      
    • 结构化的时间,用于单独获取时间的某一部分
      res = time.localtime()
      print(res)
      # time.struct_time(tm_year=2021, tm_mon=8, tm_mday=22, tm_hour=14, tm_min=4, tm_sec=23, tm_wday=6, tm_yday=234, tm_isdst=0)
      print(res.tm_year)  # 2021  # 2021年
      print(res.tm_yday)  # 234  # 今年的第234天
      
    本地时间与世界标准时间
    print(time.localtime())  # 本地时间
    # time.struct_time(tm_year=2021, tm_mon=8, tm_mday=22, tm_hour=14, tm_min=37, tm_sec=56, tm_wday=6, tm_yday=234, tm_isdst=0)
    
    print(time.gmtime())  # 世界标准时间
    # time.struct_time(tm_year=2021, tm_mon=8, tm_mday=22, tm_hour=6, tm_min=37, tm_sec=56, tm_wday=6, tm_yday=234, tm_isdst=0)
    
  2. datetime模块(import datetime)

    获取当前时间
    print(datetime.datetime.now())  # 2021-08-22 14:13:26.336758
    
    进行时间的运算
    print(datetime.datetime.now() + datetime.timedelta(days=3))
    # 2021-08-25 14:14:04.121010  # 三天后的时间
    print(datetime.datetime.now() + datetime.timedelta(weeks=1))
    # 2021-08-29 14:14:04.121010  # 一周后的时间
    

其他操作

时间格式的转换

  1. 结构化时间转换为时间戳格式(mktime)
    # struct_time--->timestamp
    import time
    
    s_time = time.localtime()
    print(time.mktime(s_time))  # 1629613708.0
    
  2. 时间戳格式转换为结构化时间(localtime)
    # timestamp--->struct_time
    import time
    
    tp_time = time.time()
    print(time.localtime(tp_time))
    # time.struct_time(tm_year=2021, tm_mon=8, tm_mday=22, tm_hour=14, tm_min=30, tm_sec=5, tm_wday=6, tm_yday=234, tm_isdst=0)
    print(time.localtime(tp_time).tm_year)  # 2021
    
  3. 结构化时间转换为格式化的字符串形式时间(strftime)
    # struct_time--->format string
    import time
    
    s_time = time.localtime()
    print(time.strftime('%Y-%m-%d %H:%M:%S', s_time))  # 2021-08-22 14:43:32
    
  4. 格式化的字符串形式时间转化为结构化时间(strptime)
    # format string--->struct_time
    import time
    
    print(time.strptime('2011-11-11 11:11:11', '%Y-%m-%d %H:%M:%S'))
    # time.struct_time(tm_year=2011, tm_mon=11, tm_mday=11, tm_hour=11, tm_min=11, tm_sec=11, tm_wday=4, tm_yday=315, tm_isdst=-1)
    
  5. ==格式化的字符串形式时间转化为时间戳格式==
    # format string--->struct_time--->timestamp
    import time
    
    # format string--->struct_time
    struct_time = time.strptime('2011-11-11 11:11:11', '%Y-%m-%d %H:%M:%S')
    # struct_time--->timestamp
    timestamp = time.mktime(struct_time)
    
    print(timestamp)  # 1320981071.0
    
  6. ==时间戳格式转化为格式化的字符串形式==
    # timestamp--->struct_time--->format string
    import time
    
    timestamp = 1320981071.0
    
    # timestamp--->struct_time
    struct_time = time.localtime(timestamp)
    # struct_time--->format string
    format_string_time = time.strftime('%Y-%m-%d %H:%M:%S', struct_time)
    
    print(format_string_time)  # 2011-11-11 11:11:11
    

应用案例

小明在 2021年8月22日21时8分22秒开通了:iphone:会员,有效时长为30天,请输出会员到期时间。​

import time

start_time = time.strptime('2021-8-22 21:8:22', '%Y-%m-%d %H:%M:%S')
# 格式化字符串 转 结构化
timestamp = time.mktime(start_time) + 30 * 24 * 3600
# 结构化 转 时间戳  进行加法
struct_time = time.localtime(timestamp)
# 时间戳 转 结构化
end_time = time.strftime('%Y-%m-%d %X', struct_time)
# 结构化 转 格式化字符串
print(end_time)  # 2021-09-21 21:08:22

了解操作

import time

time.sleep(3)  # 延时3秒
import time

print(time.asctime())  # Sun Aug 22 15:37:06 2021  # 英文格式、Linux时间格式
# 相当于这样:
print(time.strftime('%a %b %d %H %M %S %Y'))  # Sun Aug 22 15 41 28 2021
import datetime

print(datetime.datetime.now())  # 本地时间  2021-08-22 15:43:29.816787
print(datetime.datetime.utcnow())  # 国际标准时间  2021-08-22 07:43:29.816787
import datetime

# 将时间戳直接转成'%Y-%m-%d %X'形式,但形式不可更改
print(datetime.datetime.fromtimestamp(1320981071.0))  # 2011-11-11 11:11:11

二、random模块(随机模块)

主要操作

import random

print(random.random())  # (0,1)----float  大于0 且 小于1 之间的小数
# 如:0.7922767360650534
print(random.randint(1, 3))  # [1,3]  大于等于1 且 小于等于3 之间的整数
# 如:2
print(random.randrange(1, 3))  # [1,3)  大于等于1 且 小于3 之间的整数
# 如:1
print(random.choice([111, 'aaa', [4, 5]]))  # 111 或者 'aaa' 或者 [4,5]
# 如:111
print(random.sample([111, 'aaa', 'ccc', 'ddd'], 2))  # 任意 2 个 列表 内元素组合成的 新列表
# 如:['ccc', 111]
print(random.uniform(1, 3))  # 大于1 且 小于3 之间的小数
# 如:1.812852985024525

item = [1, 3, 5, 7, 9]
random.shuffle(item)  # 打乱item的顺序,相当于"洗牌"
print(item)  # [7, 3, 5, 1, 9]

应用案例

随机验证码:由数字和字母组成,可以指定位数输出的随机验证码程序。:lock:

chr():将括号内十进制数字转换为Ascll码表对应的字符。

ord():将括号内字符转换为Ascll码表对应十进制数字。

str():将括号内元素转换为字符串类型。

import random


def make_code(size=4):
    res = ''
    for i in range(size):
        s1 = chr(random.randint(65, 90))
        s2 = str(random.randint(0, 9))
        res += random.choice([s1, s2])
    return res


print(make_code(5))  # 63UH9

三、os模块(系统模块)

import os

os.getcwd()          获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir            返回当前目录: ('.')
os.pardir            获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')   可生成多层递归目录
os.removedirs('dirname1')          若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')                生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')       删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')     列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()               删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')        获取文件/目录信息
os.sep        输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串 win下为';',Linux下为':'
os.name       输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("ls /")  运行shell命令,直接显示
os.environ                 获取系统环境变量,结果是一个key和value都为字符串的字典
os.path.abspath(path)      返回path规范化的绝对路径
os.path.split(path)        将path分割成目录和文件名二元素元组返回
os.path.dirname(path)      返回path的目录(所在文件夹)。其实就是os.path.split(path)的第一个元素
os.path.basename(path)     返回path最后的文件名。如果path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)       如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)        如果path是绝对路径,返回True
os.path.isfile(path)       如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)        如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)               返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)               返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path)                返回path的大小(单位为字节)

四、sys模块

import sys

sys.argv           命令行参数List,第一个元素是程序本身路径,获取的是命令行里解释器后的参数值
sys.exit(n)        退出程序,正常退出时exit(0)
sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称

五、时间模块应用案例:打印进度条

前置知识

  1. 进度条的效果

    我们想要的进度条的效果如下

    [#             ]
    [##            ]
    [###           ]
    [####          ]
    

    并且我们想要让每一次变长后的进度条覆盖前面的一个。

  2. 指定宽度

    print('[%-15s]' % '#')     # [#              ]
    print('[%-15s]' % '##')    # [##             ]
    print('[%-15s]' % '###')   # [###            ]
    print('[%-15s]' % '####')  # [####           ]
    

    [%-15s]:指的是‘[ ]’内总宽度为15个字符大小(15),内容左对齐(-),使用百分号后面的字符串作为内容。

  3. 打印百分号(%)

    print('%s%%' % (100))  # 100%  # 第二个%号代表取消第一个%的特殊意义
    

应用

  1. 简单模拟进度条的基本效果

    import time
    
    res = ''
    for i in range(20):
        res += '#'
        time.sleep(0.1)
        print('\r[%-20s]' % res, end='')
        
    # \r表示将光标位置回退到本行的开头位置
    
  2. 完善进度条效果

    import time
    
    
    def progress(percent):
        if percent > 1:
            percent = 1
        # 根据传进来的小数算井号个数
        res = int(50 * percent) * '#'
        print('\r[%-50s] %d%%' % (res, int(100 * percent)), end='')
    
    
    recv_size = 0         # 已下载的数据量
    total_size = 1304015  # 需要下载的数据量大小
    
    while recv_size < total_size:
        # 模拟网络延迟
        time.sleep(0.01)
        # 每次下载了1024个字节的数据
        recv_size += 1024
        # 已下载的数据与数据总量算百分比,结果为小数
        percent = recv_size / total_size  # 1024 / 1304015
        # 传入小数
        progress(percent)