Files

164 lines
5.4 KiB
Python

import csv
def readStudentFile(file_path):
"""Reads student data from a file and returns a dictionary."""
students = {}
try:
with open(file_path, 'r') as file:
reader = csv.reader(file)
for row in reader:
student_id = row[0]
first_name = row[1]
last_name = row[2]
courses = {row[i]: int(row[i + 1]) for i in range(3, len(row), 2)}
students[student_id] = {
'first_name': first_name,
'last_name': last_name,
'courses': courses
}
except Exception as e:
print(f"Error reading student file: {e}")
return students
def saveStudentFile(file_path, students):
"""Saves student data to a file."""
try:
with open(file_path, 'w', newline='') as file:
writer = csv.writer(file)
for student_id, data in students.items():
row = [
student_id,
data['first_name'],
data['last_name']
]
for course, grade in data['courses'].items():
row.extend([course, grade])
writer.writerow(row)
except Exception as e:
print(f"Error saving student file: {e}")
def menu():
"""Displays the menu and gets the user's choice."""
print("\nMenu:")
print("1. Add new student")
print("2. Update grade")
print("3. Load grade updates from file")
print("4. Generate student report")
print("5. Generate course report")
print("6. Exit")
while True:
try:
choice = int(input("Enter your choice: "))
if 1 <= choice <= 6:
return choice
else:
print("Invalid choice. Please choose between 1 and 6.")
except ValueError:
print("Invalid input. Please enter a number between 1 and 6.")
def add_new_student(students):
"""Adds a new student to the data."""
student_id = input("Enter student ID: ")
if student_id in students:
print("Error: Student with this ID already exists.")
return
first_name = input("Enter first name: ")
last_name = input("Enter last name: ")
students[student_id] = {
'first_name': first_name,
'last_name': last_name,
'courses': {}
}
print("Student added successfully.")
def updateGrade(students):
"""Updates a grade for a student."""
student_id = input("Enter student ID: ")
if student_id not in students:
print("Error: Student not found.")
return
course = input("Enter course name: ").capitalize()
try:
grade = int(input("Enter grade (0-100): "))
if 0 <= grade <= 100:
students[student_id]['courses'][course] = grade
print("Grade updated successfully.")
else:
print("Error: Grade must be between 0 and 100.")
except ValueError:
print("Error: Invalid grade format.")
def loadGrades(file_path, students):
"""Loads grade updates from a file."""
try:
with open(file_path, 'r') as file:
reader = csv.reader(file)
for row in reader:
student_id, course, grade = row
if student_id in students:
students[student_id]['courses'][course] = int(grade)
else:
print(f"Warning: Student ID {student_id} not found.")
print("Grade updates loaded successfully.")
except Exception as e:
print(f"Error loading grades: {e}")
def generateStudentReport(students):
"""Generates a report for a specific student."""
student_id = input("Enter student ID: ")
if student_id not in students:
print("Error: Student not found.")
return
student = students[student_id]
print(f"\nReport for {student['first_name']} {student['last_name']}:")
total, count = 0, 0
for course, grade in student['courses'].items():
print(f"{course}: {grade}")
total += grade
count += 1
if count > 0:
print(f"Average grade: {total / count:.2f}")
def generateCourseReport(students):
"""Generates a report for a specific course."""
course = input("Enter course name: ").capitalize()
print(f"\nReport for course: {course}")
total, count = 0, 0
for student in students.values():
if course in student['courses']:
grade = student['courses'][course]
print(f"{student['first_name']} {student['last_name']}: {grade}")
total += grade
count += 1
if count > 0:
print(f"Average grade: {total / count:.2f}")
else:
print("No students found for this course.")
def main():
students = readStudentFile('students.csv')
while True:
choice = menu()
if choice == 1:
add_new_student(students)
elif choice == 2:
updateGrade(students)
elif choice == 3:
file_path = input("Enter grade updates file path: ")
loadGrades(file_path, students)
elif choice == 4:
generateStudentReport(students)
elif choice == 5:
generateCourseReport(students)
elif choice == 6:
saveStudentFile('students.csv', students)
print("Data saved. Exiting program.")
break
if __name__ == "__main__":
main()