一、时间模块
time模块与datetime模块的基本操作
-
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) -
-
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 # 一周后的时间
其他操作
时间格式的转换
-
结构化时间转换为时间戳格式(mktime)
# struct_time--->timestamp import time s_time = time.localtime() print(time.mktime(s_time)) # 1629613708.0 -
时间戳格式转换为结构化时间(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 -
结构化时间转换为格式化的字符串形式时间(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 -
格式化的字符串形式时间转化为结构化时间(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) -
==格式化的字符串形式时间转化为时间戳格式==
# 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 -
==时间戳格式转化为格式化的字符串形式==
# 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 返回操作系统平台名称
五、时间模块应用案例:打印进度条
前置知识
-
进度条的效果
我们想要的进度条的效果如下:
[# ] [## ] [### ] [#### ]并且我们想要让每一次变长后的进度条覆盖前面的一个。
-
指定宽度
print('[%-15s]' % '#') # [# ] print('[%-15s]' % '##') # [## ] print('[%-15s]' % '###') # [### ] print('[%-15s]' % '####') # [#### ][%-15s]:指的是‘[ ]’内总宽度为15个字符大小(15),内容左对齐(-),使用百分号后面的字符串作为内容。
-
打印百分号(%)
print('%s%%' % (100)) # 100% # 第二个%号代表取消第一个%的特殊意义
应用
-
简单模拟进度条的基本效果
import time res = '' for i in range(20): res += '#' time.sleep(0.1) print('\r[%-20s]' % res, end='') # \r表示将光标位置回退到本行的开头位置 -
完善进度条效果
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)