Python进阶:发明“轮子”与造“轮子” - 模块
通过本案例可以帮助我们快速掌握Python中如os、sys、time、random、datetime等常用内置模块的使用。
最新案例动态,请查阅Python进阶:发明“轮子”与造“轮子” - 模块。小伙伴们快来领取华为开发者空间进行实操吧!
1 概述
1.1 背景介绍
Python模块(Module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句。Python语言自称为内置电池,因为它提供了非常完善的基础代码库,覆盖了网络通信、文件处理、数据库接口、图形系统、XML处理等大量内容。除了强大的内置库外,Python语言还有大量的第三方工具包,这些内置库和第三方工具包都是Python语言的模块,它们相当于一个工具箱,当你需要使用某个工具时,打开其所在工具箱直取即可。
通过本案例可以帮助我们快速掌握Python中如os、sys、time、random、datetime等常用内置模块的使用。
1.2 适用对象
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计30分钟。
1.4 案例流程

说明:
① 登录华为云,开通开发者空间,进入云主机,打开CodeArts IDE for Python创建工程;
② 编写代码运行。
1.5 资源总览
本案例预计花费总计0元。
| 资源名称 | 规格 | 单价(元) | 时长(分钟) |
|---|---|---|---|
| 华为开发者空间-云主机 | 鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Ubuntu | 免费 | 30 |
2 准备开发环境
2.1 配置云主机并进入
参考“10分钟玩转云主机” 案例介绍中“2.2 申请云主机”章节内容完成华为开发者空间云主机申请与配置,配置云主机建议:“CPU架构”选择“X86”,“操作系统”选择“Ubuntu”。
然后点击进入桌面进入云主机。
2.2 使用CodeArts IDE创建工程
参考“初识云主机:CodeArts IDE入门”案例介绍“3.1 新建工程”章节新建工程。
新建的工程包含如下三个目录文件部分:
| 目录文件 | 说明 |
|---|---|
| .arts | CodeArts的配置文件 |
| venv | 虚拟环境 |
| main.py | 默认生成的入口文件 |

3 Python常用内置模块
3.1 代码练习
下面我们主要围绕Python中包含os模块、sys模块、time模块、random模块、datetime模块五个常用内置模块进行讲解与练习。
3.1.1 os模块
os模块主要负责程序与操作系统的交互,提供了访问操作系统底层的接口。部分常用方法/变量如下:
- os.path.join():路径安全拼接,自动适配系统分隔符,避免硬编码路径。
- os.makedirs(path, exist_ok=True):递归创建目录,创建多级目录,exist_ok=True避免重复创建报错。
- os.listdir(path):遍历目录内容,获取指定目录下的所有文件/子目录。
- os.path.exists(path):检查文件存在,避免文件操作时的FileNotFoundError。
- os.remove(path):文件删除。
代码示例:
import os
# 1. 路径拼接
student_id = "STU2025001"
base_path = os.path.join("labs", student_id)
# 2. 递归创建目录(含子目录)
os.makedirs(os.path.join(base_path, "code"), exist_ok=True)
os.makedirs(os.path.join(base_path, "data"), exist_ok=True)
# 3. 检查并初始化文件
config_file = os.path.join(base_path, "config.txt")
if not os.path.exists(config_file): #exists检查
with open(config_file, "w") as f:
f.write("实验配置:初始化成功")
# 4. 遍历目录并清理旧文件
for file in os.listdir(base_path): #listdir遍历
file_path = os.path.join(base_path, file)
if file.endswith(".bak"):
os.remove(file_path) #文件删除
3.1.2 sys模块
sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量,用于操控Python运行时的环境。部分常用方法/变量如下:
- sys.argv:命令行参数,argv[0]是脚本名,argv[1:]是用户输入参数。
- sys.exit(code):程序终止,code=0正常退出,非零表示错误(如1参数错误,2文件错误)。
- sys.platform:识别操作系统。
代码示例:
import sys
def main():
# 运行方法:在命令行终端中输入python fileName.py 班级 学号,fileName.py是当前代码所在文件
if len(sys.argv) < 3: #argv参数解析
print("用法: python fileName.py 班级 学号", file=sys.stderr)
sys.exit(1) #错误退出
else:
class_name, student_id = sys.argv[1], sys.argv[2]
print("class_name: ", class_name,",student_id:",student_id) #platform判断
# 系统判断
print("系统: ", sys.platform) #platform判断
sys.exit(0) #正常退出
if __name__ == "__main__":
main()
3.1.3 time模块
time模块是Python中处理时间的一个重要模块,包含了许多的有关时间操作的方法。部分常用方法/变量如下:
- time.sleep(seconds):程序暂停,暂停执行指定秒数,模拟真实时间消耗。
- time.time():时间戳(秒级),返回1970年1月1日至今的秒数,用于计算耗时。
- time.perf_counter():高精度计时,适合短时间测量(微秒级),如算法性能对比。
- time.ctime(timestamp):时间戳转换成可读时间字符串。
代码示例:
import time
# 1. 高精度计时(微秒级)
start = time.perf_counter() #perf_counter
[i**2 for i in range(1000000)] # 模拟计算
duration = time.perf_counter() - start
print(f"计算耗时:{duration:.6f}秒")
# 2. 分段计时(sleep模拟步骤)
print("等待2秒模拟数据传输...")
time.sleep(2) #sleep暂停
now_timestamp = time.time() #当前时间的时间戳
print(f"传输完成:{time.ctime(now_timestamp)}") #ctime格式化
3.1.4 random模块
random模块是Python随机函数库,用于生成随机数。部分常用方法/变量如下:
- random.randint(a, b):整数随机,生成[a, b]闭区间整数(含两端)。
- random.choice(seq):随机选择,从序列中随机选取一个元素(可重复)。
- random.shuffle(list):打乱列表,原地打乱列表顺序(破坏性操作)。
- random.sample(seq, k):无重复随机采样(指定数量)。
代码示例:
import random
students = ["A", "B", "C", "D", "E", "F"]
# 1. 生成唯一实验ID(4位)
experiment_id = random.randint(1000, 9999) #randint
print(f"实验ID:EXP-{experiment_id}")
# 2. 随机抽题(可重复)
questions = ["模块作用", "方法参数", "异常处理"]
print("随机问题:", random.choice(questions)) #choice
# 3. 无重复分组(3人/组)
random.shuffle(students)
groups = random.sample(students, len(students)) #sample
print("分组结果:", [groups[i:i+3] for i in range(0, 6, 3)])
3.1.5 datetime模块
datetime模块是Python中可操作日期和时间的模块,提供可读的日期时间对象,支持时间差计算、格式化输出,是时间管理的核心。部分常用方法/变量如下:
- datetime.now() 当前时间,获取带时区的本地时间。
- timedelta 时间差计算,表示时间间隔,支持加减、比较操作。
- strftime(format) 时间格式化,将时间对象转为指定格式字符串。
- strptime(date_str, format):字符串转时间。
代码示例:
from datetime import datetime, timedelta
# 1. 课程时间规划
start = datetime.strptime("2025-09-01 08:00:00","%Y-%m-%d %H:%M:%S")
course_weeks = 4
# 2. 生成课程表(含时间差)
for week in range(course_weeks):
week_start = start + timedelta(weeks=week)
end = week_start + timedelta(hours=2)
# 3. 时间格式化(中文星期)
weekday = week_start.strftime("%A")[:3]
print(f"第{week+1}周 {weekday}:{week_start.strftime('%H:%M')}-{end.strftime('%H:%M')}")
# 4. 剩余时间提醒
now = datetime.now()
if week_start > now:
remaining = (week_start - now).days
print(f" 剩余:{remaining}天({week_start.date()})\n")
3.2 实验课管理系统
结合上面的知识点,来看一个实验课管理系统小程序。完整代码参考如下(注意:复制使用请保持缩进相同)。
import os
import sys
import time
import random
from datetime import datetime, timedelta
# ========== 系统初始化(全模块协同) ==========
# 1. os:自动创建实验目录(学号+日期)
STUDENT_ID = input("请输入学号(如STU001): ").strip()
CURRENT_DATE = datetime.now().strftime("%Y%m%d")
LAB_DIR = os.path.join("lab_system", CURRENT_DATE, STUDENT_ID)
os.makedirs(LAB_DIR, exist_ok=True) # os.makedirs递归创建
# 2. sys:版本检查
if sys.version_info < (3, 0):
print("错误:需要Python 3.0+", file=sys.stderr)
sys.exit(1)
# ========== 核心功能类(单模块职责) ==========
class LabSystem:
def __init__(self):
self.students = self._load_students() # os文件读取
self.history = self._load_history() # os文件读取
self.questions = self._init_questions() # random问题库
def _load_students(self):
"""os:从文件加载学生名单(每行一个学号)"""
file_path = os.path.join(LAB_DIR, "students.txt")
return open(file_path).read().splitlines() if os.path.exists(file_path) else []
def _load_history(self):
"""os:加载点名历史(去重)"""
file_path = os.path.join(LAB_DIR, "history.txt")
return set(open(file_path).read().splitlines()) if os.path.exists(file_path) else set()
def _init_questions(self):
"""random:生成5道模块相关问题"""
return [
f"os.path.join的作用是?({i+1})" for i in range(3)
] + [f"time.sleep(0)的作用?({i+1})" for i in range(2)]
def smart_call(self):
"""os+random:智能点名(去重+问题)"""
if not self.students:
return "请先导入学生名单(操作1)"
# 排除最近2次点过的学生
candidates = [s for s in self.students if s not in list(self.history)[:2]]
if not candidates:
self.history.clear() # os:重置历史文件
with open(os.path.join(LAB_DIR, "history.txt"), "w"): pass
candidates = self.students
selected = random.choice(candidates)
self.history.add(selected) # os:追加历史
with open(os.path.join(LAB_DIR, "history.txt"), "a") as f:
f.write(f"{selected}\n")
return f"点名:{selected}\n? 问题:{random.choice(self.questions)}"
def timer_experiment(self, minutes):
"""time+datetime:带自动保存的实验计时"""
start = datetime.now()
print(f"\n实验开始:{start.strftime('%H:%M:%S')}")
print(f"\n剩余:{minutes}分钟(输入exit提前结束)")
for _ in range(minutes*60):
time.sleep(1) # 1秒计时
# 自动保存(每1分钟,datetime)
if (datetime.now() - start).seconds % 60 == 0:
self._save_progress(start)
#接收输入,如果输入exit就退出
stop = sys.stdin.readline().strip()
if stop == "exit":
break # 检测输入exit结束
duration = datetime.now() - start
self._save_report(start, duration) # os:保存报告
return f"实验结束!耗时:{duration.seconds//60}分{duration.seconds % 60}秒\n报告路径:{LAB_DIR}"
def _save_progress(self, start):
"""os+datetime:保存进度(带时间戳)"""
timestamp = start.strftime("%H%M%S")
with open(os.path.join(LAB_DIR, f"progress_{timestamp}.log"), "a") as f:
f.write(f"[自动保存-{timestamp}] 实验进行中...\n")
def _save_report(self, start, duration):
"""os+datetime:生成最终报告"""
report_name = start.strftime("%Y%m%d_%H%M%S") + "_report.txt"
with open(os.path.join(LAB_DIR, report_name), "w") as f:
f.write(f"实验学号:{STUDENT_ID}\n")
f.write(f"开始时间:{start.strftime('%Y-%m-%d %H:%M')}\n")
f.write(f"耗时:{duration.seconds//60}分钟\n")
f.write(f"随机问题:{self.questions[0]}\n") # 示例答案
# ========== 交互界面(全模块联动) ==========
def main():
system = LabSystem()
while True:
print("\n=== 实验课智能管理系统 ===")
print("1. 导入学生名单(自动生成students.txt)")
print("2. 智能点名(含随机问答)")
print("3. 开始计时(输入分钟数)")
print("4. 查看报告(按时间排序)")
print("5. 退出系统(sys.exit)")
choice = input("请选择操作(1-5): ")
# 1. os:初始化学生名单
if choice == "1":
if system.students:
print("名单已存在,覆盖请删除students.txt")
continue
system.students = ["STU001", "STU002", "STU003", STUDENT_ID]
with open(os.path.join(LAB_DIR, "students.txt"), "w") as f:
f.write("\n".join(system.students))
print(f"已导入{len(system.students)}名学生")
# 2. random+os:智能点名
elif choice == "2":
print(system.smart_call())
# 3. time+datetime:实验计时
elif choice == "3":
try:
mins = int(input("请输入实验时长(分钟): "))
print(system.timer_experiment(mins))
except ValueError:
print("错误:请输入数字(如60)")
# 4. os:查看报告(按修改时间排序)
elif choice == "4":
reports = [f for f in os.listdir(LAB_DIR) if f.endswith(".txt")]
if not reports:
print("暂无报告")
continue
print("\n最新3份报告:")
for f in sorted(reports, key=lambda x: os.path.getmtime(os.path.join(LAB_DIR, x)), reverse=True)[:3]:
size = os.path.getsize(os.path.join(LAB_DIR, f))
print(f"- {f} ({size}字节)")
# 5. sys:退出系统
elif choice == "5":
print(f"\n退出系统,数据已保存到:{os.path.abspath(LAB_DIR)}")
sys.exit(0)
else:
print("无效选择,请输入1-5")
if __name__ == "__main__":
main()
同时,可以参考上面代码进行扩展练习,例如:实验数据统计,读取LAB_DIR下的实验数据文件进行统计操作。
更多推荐




所有评论(0)