import json from pathlib import Path from typing import List, Dict import pickle
class Student: def __init__(self, name: str, age: int, grades: Dict[str, float]): self.name = name self.age = age self.grades = grades @property def average_grade(self): return sum(self.grades.values()) / len(self.grades) if self.grades else 0 def to_dict(self): return { "name": self.name, "age": self.age, "grades": self.grades } @classmethod def from_dict(cls, data: Dict): return cls(data["name"], data["age"], data["grades"])
class StudentManager: def __init__(self, data_dir: str = "student_data"): self.data_dir = Path(data_dir) self.data_dir.mkdir(exist_ok=True) def save_students_json(self, students: List[Student], filename: str = "students.json"): """保存为JSON格式(人类可读)""" filepath = self.data_dir / filename data = [student.to_dict() for student in students] with open(filepath, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) print(f"已保存 {len(students)} 名学生到 {filepath}") def save_students_pickle(self, students: List[Student], filename: str = "students.pkl"): """保存为pickle格式(保留Python对象特性)""" filepath = self.data_dir / filename with open(filepath, "wb") as f: pickle.dump(students, f) print(f"已保存 {len(students)} 名学生到 {filepath}") def load_students_json(self, filename: str = "students.json") -> List[Student]: """从JSON文件加载""" filepath = self.data_dir / filename if not filepath.exists(): return [] with open(filepath, "r", encoding="utf-8") as f: data = json.load(f) return [Student.from_dict(item) for item in data] def load_students_pickle(self, filename: str = "students.pkl") -> List[Student]: """从pickle文件加载""" filepath = self.data_dir / filename if not filepath.exists(): return [] with open(filepath, "rb") as f: return pickle.load(f)
if __name__ == "__main__": students = [ Student("张三", 20, {"数学": 90, "英语": 85, "编程": 95}), Student("李四", 21, {"数学": 88, "英语": 92, "编程": 89}), Student("王五", 19, {"数学": 95, "英语": 88, "编程": 93}) ] manager = StudentManager() manager.save_students_json(students) manager.save_students_pickle(students) json_students = manager.load_students_json() pickle_students = manager.load_students_pickle() print("\n从JSON加载的学生:") for student in json_students: print(f"{student.name}: 平均分 {student.average_grade:.1f}") print("\n从pickle加载的学生:") for student in pickle_students: print(f"{student.name}: 平均分 {student.average_grade:.1f}")
|