目录
【参考链接】:https://www.cnblogs.com/linhaifeng/articles/6384466.html
1.time模块
import time
1.1 时间戳
时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
import time
time_stamp = time.time()
print(f'时间戳:{time_stamp}', f'==>类型为{type(time_stamp)}')
#输出:时间戳:1725410334.5460565 ==>类型为<class 'float'>
1.2 格式化时间
格式化的时间字符串(formatstring):格式化时间表示的是普通的字符串格式的时间。
format_time = time.strftime("%Y-%m-%d %H:%M:%S") # 输出:2024-09-04 08:43:45
format_time1 = time.strftime("%Y-%m-%d %H:%M:%s") # 输出:2024-09-04 08:43:1725410625
format_time2 = time.strftime("%Y-%m-%d %X") # 输出:2024-09-04 08:43:45
1.3 结构化时间
结构化的时间(struct time):struct_time元组共有9个元素共九个元素,分别为(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
'''本地时间,中国为东八区时间'''
print('本地时区的struct_time:\n{}'.format(time.localtime()))
'''世界标准时间,0时区'''
print('UTC时区的struct_time:\n{}'.format(time.gmtime()))
#注意:从输出结果来看,东八区的时间比0时区的时间晚8小时(见:tm_hour)
本地时区的struct_time:
time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=8, tm_min=47, tm_sec=49, tm_wday=2, tm_yday=248, tm_isdst=0)
UTC时区的struct_time:
time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=0, tm_min=47, tm_sec=49, tm_wday=2, tm_yday=248, tm_isdst=0)
1.3.1 结构化时间的基准时间
print(time.localtime(0))
输出:time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
1.3.2 结构化时间的基准时间上增加一年时间
print(time.localtime(365*24*3600))
输出:time.struct_time(tm_year=1971, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=1, tm_isdst=0
1.4 不同格式时间的转换
如上图所示,我们总能通过某些方法在结构化时间-格式化时间-时间戳三者之间进行转换,下面我们将用代码展示如何通过这些方法转换时间格式
'''案例1:结构化时间==>时间戳和格式化时间'''
#结构化时间
now_time = time.localtime()
print(now_time) # time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=9, tm_min=5, tm_sec=1, tm_wday=2, tm_yday=248, tm_isdst=0)
#把结构化时间转换为时间戳格式
time_stamp = time.mktime(now_time)
print(time_stamp) # 1725411982.0
#把结构化时间转换为格式化时间
#%Y年-%m月-%d天 %X时分秒=%H时:%M分:%S秒
time_strf = time.strftime("%Y-%m-%d %X", now_time)
print(time_strf) # 2024-09-04 09:08:26
'''案例2:
1.1 将格式化时间转为结构化时间
1.2 将格式化时间转为"‘sun Jun 20 23:21:05 1993"这种形式的时间格式
'''
# 把格式化时间转化为结构化时间,和strftime()是逆操作
print(time.strptime(time_strf, "%Y-%m-%d %X")) # time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=9, tm_min=16, tm_sec=0, tm_wday=2, tm_yday=248, tm_isdst=-1)
print(type(time.strptime(time_strf, "%Y-%m-%d %X"))) # <class 'time.struct_time'>
# 把结构化时间表示为这种形式:'sun Jun 20 23:21:05 1993'
print(f'::::time.asctime():::::==>{time.asctime()}') # Wed Sep 4 09:19:20 2024
# 如果参数没给或为None时,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))
print(f':::::::time.ctime()::::==>{time.ctime()}')
print(f'time.ctime(time.time())==>{time.ctime(time.time())}')
1 # 其他用法
2 # sleep(secs)
3 # 线程推迟指定的时间运行,单位为秒。
2.datetime
import datetime
import time
#1.返回当前时间
print(datetime.datetime.now())
#2.将时间戳直接转化成日期格式
print(datetime.date.fromtimestamp(time.time()))
#3.当前时间基础上加10天
print(datetime.datetime.now()+datetime.timedelta(10))
#4.当前时间基础上减3天
print(datetime.datetime.now()+datetime.timedelta(-3))
#5.当前时间基础上加1小时
print(datetime.datetime.now()+datetime.timedelta(hours=1))
#6.当前时间基础上加30分钟
print(datetime.datetime.now()+datetime.timedelta(minutes=30))
print('='*50)
#7.将时间的某一年(或月、日、时、分、秒等)进行替换
c_time =datetime.datetime.now()
print(c_time)
print(c_time.replace(year=2018))
>输出结果:
2024-09-06 09:32:24.676974
2024-09-06
2024-09-16 09:32:24.676998
2024-09-03 09:32:24.677003
2024-09-06 10:32:24.677007
2024-09-06 10:02:24.677012
==================================================
2024-09-06 09:32:24.677017
2018-09-06 09:32:24.677017
3.random模块
import random
print(random.random()) #随机生成大于0且小于1之间的小数 <class 'float'>
print(random.randint(1,3)) # random.randint(a, b)函数用于生成一个在 a 和 b 之间的随机整数,包括 a 和 b。
print(random.randrange(1,3)) # 随机生成 大于等于1且小于3之间的整数
print(random.choice([11, 'aaa', [666, 888]])) # 随机输出 11或'aaa'或'[666,88]'
print(random.sample([11, 22, 'aaa','bbb', [666,888]],2)) #列表元素任意2个组合
print(random.sample([11, 22, 'aaa','bbb', [666,888]],3)) #列表元素任意3个组合
print(random.sample([11, 22, 'aaa','bbb', [666,888]],4)) #列表元素任意4个组合
print(random.uniform(1,6)) # 随机生成:大于1小于3的小数,如3.4509038976731077
# 打乱item的顺序,相当于"洗牌"
item = [1,2,3,4,5,6]
res = random.shuffle(item)
print(res) # 打印:None
print(item) # 打印乱序的item列表,如 [2, 3, 4, 1, 5, 6]
案例:生成随机验证码
# ASCLL码:65~90代表26个大写英文字幕,97~122代表26个小写字幕
# chr() 是一个内置函数,它用于将一个整数转换为对应的 Unicode
import random
def make_code(n):
res = ''
for i in range(n):
s1 = chr(random.randint(65, 90))
s2 = str(random.randint(0, 9))
s3 = chr(random.randint(97,122))
res += random.choice([s1, s2, s3])
return res
print(make_code(6)) # 随机生成6位数的验证码,在26个大写字母、26个小写字母、0-9中随机组合
4.os模块
os模块:是与操作系统交互的一个接口
常用部分:
print("当前 Python 脚本的目录是:", os.path.dirname(__file__))
# 推荐用这种::
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
import os
1、os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
2、os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
3、os.curdir 返回当前目录: ('.')
4、os.pardir 获取当前目录的父目录字符串名:('..')
5、os.makedirs('dirname1/dirname2') 可生成多层递归目录
6、os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
7、os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
8、os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
9、os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10、os.remove() 删除一个文件
11、os.rename("oldname","newname") 重命名文件/目录
12、os.stat('path/filename') 获取文件/目录信息
13、os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
14、os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
15、os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
16、os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17、os.system("bash command") 运行shell命令,直接显示
18、os.environ 获取系统环境变量
19、os.path.abspath(path) 返回path规范化的绝对路径
20、os.path.split(path) 将path分割成目录和文件名二元组返回
21、os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
22、os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23、os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
24、os.path.isabs(path) 如果path是绝对路径,返回True
25、os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
26、os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
27、os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28、os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
29、os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
30、os.path.getsize(path) 返回path的大小
'''案例1:os.getcwd() 获取当前工作目录'''
print(os.getcwd()) # D:\my_python_project\day22
'''案例2: os.chdir()改变工作目录'''
# 改变当前工作目录,随后在新目录下创建一个文件夹aaa
os.chdir(r'D:\my_python_project\tests\temp')
os.mkdir('aaa') # 在D:\my_python_project\tests\temp目录下创建了一个文件夹aaa
'''案例3:os.curdir返回当前目录'''
# 打印当前工作目录
print("当前工作目录:", os.getcwd()) # 当前工作目录: D:\my_python_project\tests\day22
# 切换到当前目录的子目录
os.chdir(os.curdir + r'/a1')
# 再次打印当前工作目录
print("当前工作目录:", os.getcwd()) # 当前工作目录: D:\my_python_project\tests\day22\a1
'''案例4:os.pardir获取当前目录的父目录字符串名('..')'''
# 打印当前工作目录
print("当前工作目录:", os.getcwd()) # D:\my_python_project\tests\day22
# 切换到当前目录的父目录
os.chdir(os.pardir)
# 再次打印当前工作目录
print("当前工作目录:", os.getcwd()) # D:\my_python_project\tests
'''案例5:可生成多层递归目录'''
# 创建一个目录
os.makedirs(r'D:\my_python_project\test\day22\subdirectory')
# 再次创建同一个目录,但设置 exist_ok=True
os.makedirs(r'D:\my_python_project\test\day22\subdirectory', exist_ok=True)
'''案例6:os.removedirs() 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推'''
os.removedirs(r'D:\my_python_project\tests\day22\a1\a2\a3') # 如果a3、a2、a1目录均为空,直接删除a1目录
# 如果a2目录不为空,仅删除a3目录
'''案例7:os.mkdir('dirname') 生成单级目录'''
os.mkdir(r'D:\my_python_project\tests\day22\a1') # day22下创建a1目录
'''案例8:os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错'''
os.removedirs(r'D:\my_python_project\tests\day22\a1\a2\a3') # 仅删除a3目录
'''案例9:os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印'''
#前置条件:目录为'D:\my_python_project\tests\day22\a1\a2\a3,且a1、a2、a3均为空文件夹
res = os.listdir(r'D:\my_python_project\tests\day22')
print(res, type(res)) # ['a1', 'os模块.py'] <class 'list'>
'''案例10: 删除一个文件,删除1.py'''
os.remove(r'D:\my_python_project\tests\day22\1.py')
'''案例11:os.rename("oldname","newname") 重命名文件/目录'''
os.rename(r'D:\tests\day22\a1', r'D:\tests\day22\a111') # 将未使用的a1目录名更改为a111名
'''案例12:os.stat('path/filename') 获取文件/目录信息'''
print(os.stat(r'D:\my_python_project\test\os_test.py'))
#打印:os.stat_result(st_mode=33206, st_ino=5348024557513797, st_dev=4036880606, st_nlink=1, st_uid=0, st_gid=0, st_size=319, st_atime=1725698699, st_mtime=1725698696, st_ctime=1725698407)
'''案例13:os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"'''
print(os.sep) # \
'''案例14:os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"'''
# 打印当前操作系统的换行符
print("当前操作系统的换行符是:", os.linesep) #windows python10运行无输出结果?why??
# 写入文件时使用换行符
with open("example.txt", "w") as file:
file.write("第一行" + os.linesep + "第二行")
'''案例15:os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:'''
print("当前操作系统的路径分隔符是:", os.pathsep)
# 分割路径字符串
paths = "path1" + os.pathsep + "path2" + os.pathsep + "path3"
print("分割后的路径列表:", paths.split(os.pathsep))
'''案例16:os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix''''
# 打印当前操作系统的名称
print("当前操作系统的名称是:", os.name)
# 根据操作系统执行不同的操作
if os.name == 'nt':
print("这是一个 Windows 系统")
elif os.name == 'posix':
print("这是一个 Unix 或 Linux 系统")
'''案例17:os.system("bash command") 运行shell命令,直接显示''''
os.system("ls -l")
'''案例18:os.environ 获取系统环境变量,get()获取某个环境变量,os.environ['xx']设置某个环境变量 ''''
print(os.environ)
# 获取环境变量的值
home_dir = os.environ.get('HOME')
print("HOME 环境变量的值是:", home_dir)
#设置环境变量的值
os.environ['MY_VAR'] = 'my_value'
print("MY_VAR 环境变量的值是:", os.environ['MY_VAR'])
'''案例19:os.path.abspath(path) 返回path规范化的绝对路径''''
# 获取一个相对路径的绝对路径
relative_path = "example.txt"
absolute_path = os.path.abspath(relative_path)
print("相对路径的绝对路径是:", absolute_path)
'''案例20:os.path.split(path) 将path分割成目录和文件名二元组返回'''
path = "/home/user/example.txt"
directory, filename = os.path.split(path)
print("目录是:", directory) # 打印:/home/user
print("文件名是:", filename) # 打印:example.txt
'''案例21:os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素'''
# 获取一个文件的目录
path = "/home/user/example.txt"
directory = os.path.dirname(path)
print("文件的目录是:", directory) # /home/user
# 获取一个目录的父目录
path = "/home/user"
directory = os.path.dirname(path)
print("目录的父目录是:", directory) # /home
'''案例22:os.path.basename(path) 如果 path 是一个文件名,os.path.basename(path) 会返回该文件名;如果 path 是一个目录名,os.path.basename(path) 会返回该目录的最后一部分。'''
# 获取一个文件的文件名
path = "/home/user/example.txt"
filename = os.path.basename(path)
print("文件的文件名是:", filename)
# 获取一个目录的最后一部分
path = "/home/user"
filename = os.path.basename(path)
print("目录的最后一部分是:", filename)
'''案例23:它用于检查 path 参数指定的文件或目录是否存在。如果 path 存在,os.path.exists(path) 会返回 True;如果 path 不存在,os.path.exists(path) 会返回 False。'''
# 检查一个文件是否存在
path = "/home/user/example.txt"
if os.path.exists(path):
print("文件存在")
else:
print("文件不存在")
# 检查一个目录是否存在
path = "/home/user"
if os.path.exists(path):
print("目录存在")
else:
print("目录不存在")
'''案例24:os.path.isabs(path) 如果path是绝对路径,返回True'''
# 检查一个路径是否是绝对路径
print("path1 是绝对路径:", os.path.isabs( "/home/user/example.txt")) # True
print("path2 是绝对路径:", os.path.isabs("example.txt")) # False
'''案例25:os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False'''
# 检查一个路径是否是一个存在的文件
path1 = "/home/user/example.txt"
path2 = "/home/user"
print("path1 是一个存在的文件:", os.path.isfile(path1))
print("path2 是一个存在的文件:", os.path.isfile(path2))
'''案例26:如果 path 是一个存在的目录,os.path.isdir(path) 会返回 True;如果 path 不是一个存在的目录,os.path.isdir(path) 会返回 False'''
# 检查一个路径是否是一个存在的目录
path1 = "/home/user"
path2 = "/home/user/example.txt"
print("path1 是一个存在的目录:", os.path.isdir(path1))
print("path2 是一个存在的目录:", os.path.isdir(path2))
'''案例27:os.path.join(path1[, path2[, ...]]),它用于将多个路径组合成一个完整的路径。os.path.join() 函数会根据操作系统的规则来处理路径分隔符'''
# 组合多个路径
path = os.path.join("/home", "user", "example.txt")
print("组合后的路径是:", path)
'''案例28:它用于返回 path 参数所指向的文件或目录的最后访问时间。返回值是一个浮点数,表示从纪元(1970年1月1日00:00:00)到指定时间的秒数。'''
# 获取一个文件的最后访问时间
print(os.path.getatime(r'D:\my_python_project\tests\day20\xx.py'))
# 获取一个文件夹的最后访问时间
print(os.path.getatime(r'D:\my_python_project\tests\day20'))
'''案例29:它用于返回 path 参数所指向的文件或目录的最后修改时间。返回值是一个浮点数,表示从纪元(1970年1月1日00:00:00)到指定时间的秒数。'''
os.path.getmtime(r'/home/user/example.txt')
os.path.getmtime(r'/home/user)
'''案例30:os.path.getsize(path) 只能获取文件的大小'''
print(os.path.getsize(r"/home/user/temp.txt"))
5.sys模块
1、sys.argv 命令行参数List,第一个元素是程序本身路径
2、sys.exit(n) 退出程序,正常退出时exit(0);n 是一个可选的整数参数,如果省略 n,则默认为 0
3、sys.version 获取Python解释程序的版本信息
4、sys.maxsize 它表示Python整型能表示的最大值
5、sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6、sys.platform 返回操作系统平台名称
'''案例1:sys.argv的用法'''
sys.argv 的详细解释:
sys.argv[0]:脚本的名称。
sys.argv[1]:第一个命令行参数。
sys.argv[2]:第二个命令行参数。
以此类推...
例如,如果你有一个名为 script.py 的 Python 脚本,并且你通过命令行运行它,如下所示
>python script.py arg1 arg2 arg3
那么在 script.py 中,sys.argv 将包含以下内容:
>['script.py', 'arg1', 'arg2', 'arg3']==>即sys.argv[0]=script.py
#sys模块.py文件代码如下,在终端运行:python .\sys模块.py aaaaa bbbbbb
print(sys.argv) # 得到一个列表:['D:\\my_python_project\\sys模块.py']
print("sys.argv[0]:",sys.argv[0]) # 取索引为0的值
print("sys.argv[0]:",sys.argv[1])
print("sys.argv[1]:",sys.argv[2])
>>输出如下:
['.\\sys模块.py', 'aaaaa', 'bbbbbb']
sys.argv[0]: .\sys模块.py
sys.argv[0]: aaaaa
sys.argv[1]: bbbbbb
'''案例2:ssys.exit(n)的用法'''
# 正常退出
sys.exit(0)
# 非正常退出,状态码为 1
sys.exit(1)
# sys.exit(n) 会引发 SystemExit 异常,如果你在程序中捕获了这个异常,可以执行一些清理工作,
但程序最终还是会退出。如果你没有捕获这个异常,程序会立即退出,并且不会执行后续的代码。
try:
sys.exit(1)
except SystemExit as e:
print(f"Program exited with status {e.code}")
'''案例3:sys.version用于获取当前 Python 解释器的版本信息'''
print(sys.version)
'''案例4:sys.maxsize表示 Python 整型能表示的最大值'''
print(sys.maxsize)
'''案例5:sys.path 是一个列表,用于存储模块的搜索路径。
当你尝试导入一个模块时,Python 解释器会在 sys.path 列表中的路径下查找这个模块'''
print(sys.path) # 打印sys.path的当前内容,通常包括当前目录、Python 安装目录以及一些环境变量指定的目录
# 添加一个新的路径
sys.path.append('/my/new/path')
# 现在导入模块时,Python 也会在'/my/new/path'这个路径下查找
import my_module
'''案例6:'''
print(sys.platform)
# Windows系统可能是'win32'或'win-amd64'(对于64位系统)等。
# inux系统,通常是'linux'。
# macOS系统,通常是'darwin'。
补充:enumerate
功能说明:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
同时列出数据和数据下标,一般用在 for 循环当中。
enumerate() 函数的基本语法如下: enumerate(iterable, start=0)
'''案例'''
fruits = ['apple', 'banana', 'mango']
# 使用 enumerate() 函数
for i, fruit in enumerate(fruits):
print(f"Index: {i}, Fruit: {fruit}")
#输出:
Index: 0, Fruit: apple
Index: 1, Fruit: banana
Index: 2, Fruit: mango
打印进度条
'''进度条的效果
[# ]
[## ]
[### ]
[#### ]
'''
import sys
import time
'''知识储备'''
# %-15s:表示一个左对齐,最小宽度为15个字符
# # %15s:表示一个右对齐,最小宽度为15个字符
print('[%15s]' %'#') # 输出:[ #]
print('[%-15s]' %'#') # 输出:[# ]
#打印%
# %s 是一个占位符,表示一个字符串。在这个例子中,它将被替换为 100。
# %% 是一个特殊的占位符,表示一个字面的 % 字符。因为在格式化字符串中,% 是一个特殊的字符,用于引入占位符,所以如果你想在结果字符串中包含一个字面的 %,你需要使用 %%。
print('%s%%' %(100)) #第二个%号代表取消第一个%的特殊意义
'''案例1:模拟出进度条'''
for i in range(50):
time.sleep(0.1)
percent = (i+1) / 50
res = int(50*percent) * '#'
if percent >= 100:
percent = 100
#在Python中,\r是一个特殊的转义字符,表示回车(CarriageReturn)
#需要注意的是,\r只会影响到光标的位置,它不会删除或替换光标后面的字符。如果你想在打印时覆盖整行,你需要在字符串的末尾添加 \r,然后立即打印新的内容。例如:
print('\r[%-50s] %d%%' %(res,int(100*percent)), end='') # end='' 表示输出内容的末尾添加一个空字符串
'''案例2:打印下载时的进度条,将进度条封装成函数'''
def progress(percent, width=50):
if percent >= 1:
percent = 1
time.sleep(0.1)
res = int(width*percent)*'#'
print('\r[%-50s] %d%%' %(res,int(100*percent)), end='')
date_size = 102222
recv_size = 0
while recv_size < date_size:
time.sleep(0.01)
recv_size += 1024
percent = recv_size / date_size
progress(percent, width=50)
'''3、疑点:如何将上述打印中的width -50 写活???'''
import time
import sys
def process(width):
for i in range(width):
time.sleep(0.1)
percent = (i+1) / width
res = int(width * percent) * '#'
if percent >= 1:
percent = 1
# 关键写法如下,width不变=已打印的进度## + 未打印的空部分''
print('\r[%s%s] %d%%' % ('=' * int(width * percent), ' ' * (width - int(width * percent)), int(percent * 100)), end='')
process(50)