最新案例动态,请查阅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 案例流程

9fd67b06a3a809366e78c96eeba1a887.png

说明:

① 登录华为云,开通开发者空间,进入云主机,打开CodeArts IDE for Python创建工程;
② 编写代码运行。

1.5 资源总览

本案例预计花费总计0元。

资源名称 规格 单价(元) 时长(分钟)
华为开发者空间-云主机 鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Ubuntu 免费 30

2 准备开发环境

2.1 配置云主机并进入

参考“10分钟玩转云主机” 案例介绍中“2.2 申请云主机”章节内容完成华为开发者空间云主机申请与配置,配置云主机建议:“CPU架构”选择“X86”,“操作系统”选择“Ubuntu”。
974679cf89db34fb55c1442a30839207.png

然后点击进入桌面进入云主机。
21f91a63b7e18ebfad752ed901c2ca6c.png

2.2 使用CodeArts IDE创建工程

参考“初识云主机:CodeArts IDE入门”案例介绍“3.1 新建工程”章节新建工程。

新建的工程包含如下三个目录文件部分:

目录文件 说明
.arts CodeArts的配置文件
venv 虚拟环境
main.py 默认生成的入口文件

68d46cce9998a4909cd7a04f1fa7956f.png

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下的实验数据文件进行统计操作。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐