python第三次作业

第一题

题目

1.使用os和os.path以及函数的递归完成: 给出一个路径,遍历当前路径所有的文件及文件夹 打印输出所有的文件(遇到文件输出路径,遇到文件夹继续进文件夹)

代码

python 复制代码
import os
import os.path

def simple_traverse(current_path):
    # 检查路径是否存在,不存在则跳过
    if not os.path.exists(current_path):
        return

    # 获取当前路径下的所有条目(文件和文件夹)
    # os.listdir() 会列出目录下的所有内容(不包含'.'和'..')
    for item_name in os.listdir(current_path):
        # 构建完整路径
        full_item_path = os.path.join(current_path, item_name)

        # 判断是文件还是文件夹
        if os.path.isfile(full_item_path):
            # 如果是文件,打印它的完整路径
            print(full_item_path)
        elif os.path.isdir(full_item_path):
            # 如果是文件夹,递归调用自身来遍历这个子文件夹
            simple_traverse(full_item_path)

if __name__ == "__main__":
    # 设置你想要遍历的起始路径
    start_directory = "homework"
    print(f"开始遍历: {os.path.abspath(start_directory)}") # 打印绝对路径方便查看
    simple_traverse(start_directory)
    print("遍历结束。")

第二题

题目

2.使用加密模块及IO模拟登录功能,要求使用文件模拟数据库存储用户名和密码。

代码

python 复制代码
import hmac
 
def encryption_admin(str_data):
    salt = "*****!!!!".encode("utf-8")
    return hmac.new(salt, str_data.encode("utf-8"), "md5").hexdigest()
 
def load_user_from_zm():
    user_data = {}
    with open("zm.txt", "r", encoding="utf-8") as f:
        content = f.read().strip()
        stored_username, stored_pwd = content.split(" ")
        user_data["username"] = encryption_admin(stored_username)
        user_data["password"] = encryption_admin(stored_pwd)
    return user_data
 
database = load_user_from_zm()
user_input = input("请输入用户名和密码并使用空格分隔: ")
username, password = user_input.split(" ")
 
if (encryption_admin(username) == database["username"] and
    encryption_admin(password) == database["password"]):
    print("登录成功")
else:
    print("登录失败")

第三题

题目

3.使用面向对象编程完成学生信息录入功能,数据存储在本地文件txt中,并读取学生信息并按照成绩进行排序,学生其他属性自行规划

代码

python 复制代码
class Student:
    """
    表示一个学生对象,包含姓名、学号、语文、数学、英语成绩以及总分。
    """
    def __init__(self, name, number, chinese, math, english):
        self.name = name
        self.number = number
        self.chinese = chinese
        self.math = math
        self.english = english
        # 计算总分
        self.total = chinese + math + english

    def to_string(self):
        """
        将学生信息转换为字符串格式,用于存储到文件。
        格式为:姓名|学号|语文|数学|英语|总分
        """
        return f"{self.name}|{self.number}|{self.chinese}|{self.math}|{self.english}|{self.total}"

    def from_string(self, line):
        """
        从字符串解析学生信息,用于从文件读取。
        """
        parts = line.strip().split("|")
        self.name = parts[0]
        self.number = parts[1]
        self.chinese = int(parts[2])
        self.math = int(parts[3])
        self.english = int(parts[4])
        self.total = self.chinese + self.math + self.english # 重新计算总分
        return self

class StudentManager:
    """
    管理学生信息的类,负责学生信息的录入、加载、保存和排序。
    """
    def __init__(self, file_path="students.txt"):
        self.file_path = file_path

    def add_student(self, student):
        """
        向文件中添加一个学生的信息。
        """
        with open(self.file_path, "a", encoding="utf-8") as f:
            f.write(student.to_string() + "\n")
        print(f"学生 '{student.name}' 的信息已保存!")

    def load_students(self):
        """
        从文件中加载所有学生的信息。
        """
        students = []
        try:
            with open(self.file_path, "r", encoding="utf-8") as f:
                for line in f:
                    if line.strip():
                        student = Student("", "", 0, 0, 0) # 创建一个空对象
                        student.from_string(line)
                        students.append(student)
        except FileNotFoundError:
            print(f"文件 '{self.file_path}' 不存在,将创建一个新的学生列表。")
        return students

    def sort_students_by_total(self, students):
        """
        对学生列表按总分降序排序。
        """
        students.sort(key=lambda s: s.total, reverse=True)
        return students

# --- 主程序部分 ---

manager = StudentManager()

print("--- 学生信息录入 ---")

while True:
    command = input("请输入 'add' 录入学生信息,输入 'view' 查看并排序,输入 'quit' 退出: ")

    if command == 'add':
        # 录入学生信息
        name = input("请输入学生姓名:")
        number = input("请输入学生的学号:")
        try:
            chinese = int(input("请输入学生的语文成绩:"))
            math = int(input("请输入学生的数学成绩:"))
            english = int(input("请输入学生的英语成绩:"))

            student = Student(name, number, chinese, math, english)
            manager.add_student(student)
        except ValueError:
            print("成绩输入错误,请确保输入的是数字!")

    elif command == 'view':
        # 查看并排序学生信息
        print("\n--- 查看和排序学生信息 (按总分降序) ---")
        all_students = manager.load_students()

        if not all_students:
            print("当前没有学生信息。")
            continue

        print("\n--- 原始学生信息 ---")
        for s in all_students:
            print(s.to_string())

        # 只提供按总分降序排序
        sorted_students = manager.sort_students_by_total(all_students)

        print("\n--- 按总分降序排序后 ---")
        for s in sorted_students:
            print(s.to_string())

    elif command == 'quit':
        # 退出程序
        print("感谢使用,再见!")
        break

    else:
        print("无效的命令。")

相关推荐
ShineWinsu9 小时前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
小付同学呀9 小时前
C语言学习(五)——输入/输出
c语言·开发语言·学习
梦幻精灵_cq10 小时前
学C之路:不可或缺的main()主函数框架(Learn-C 1st)
c语言·开发语言
love530love10 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
哈里谢顿10 小时前
Django 应用 OOM(Out of Memory)故障的定位思路和排查方法
python·django
消失的旧时光-194310 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
甄心爱学习10 小时前
【python】获取所有长度为 k 的二进制字符串
python·算法
王码码203511 小时前
Flutter for OpenHarmony:Flutter 三方库 bluez 玩转 Linux 风格的蓝牙操作(蓝牙底层互操作)
linux·运维·服务器·前端·flutter·云原生·harmonyos
福大大架构师每日一题11 小时前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
tuotali202611 小时前
氢气压缩机技术规范亲测案例分享
人工智能·python