from os import strerror class StudentsDataException(Exception): pass class BadLine(StudentsDataException): def __init__(self, line_number, line): message = "Riga " + str(line_number) + ": " + line.rstrip() super().__init__(message) class FileEmpty(StudentsDataException): def __init__(self): super().__init__("il file esiste, ma e' vuoto") file_name = input("Inserisci il nome del file del Prof. Jekyll: ") students = {} try: stream = open(file_name, "rt", encoding="utf-8") lines = stream.readlines() stream.close() if len(lines) == 0: raise FileEmpty() for line_number, line in enumerate(lines, 1): parts = line.split() # Ogni riga deve avere esattamente: nome, cognome, punti. if len(parts) != 3: raise BadLine(line_number, line) first_name = parts[0] last_name = parts[1] try: # Accettiamo sia il punto sia la virgola come separatore decimale. points = float(parts[2].replace(",", ".")) except ValueError: raise BadLine(line_number, line) student = first_name + " " + last_name if student in students: students[student] += points else: students[student] = points if len(students) == 0: raise FileEmpty() for student in sorted(students.keys()): print(student, students[student]) except FileEmpty as e: print("Errore:", e) except BadLine as e: print("Errore nei dati di input:", e) except IOError as e: print("Errore di I/O:", strerror(e.errno))