Сохранение веденных данных и последующий вывод

Пишу консольную программу, и пока решил не прибегать к использованию библиотек для сохранения данных по типу db.

Сама задача: мне нужно что бы когда я ввожу данные при sign up в t.teacher_information_input() веденные данные куда либо сохранялись, и после я мог их вывести при помощи PrettyTable(). А так выходит что данные записываются в том же t.teacher_information_input() но после я не могу их вывести никак и выводится это:

введите сюда описание изображения

Плюс нужно сделать так что бы туда сохранялась информация после закрытия программы, и с двух классов, т е при использовании функций s.student_information_input() и t.teacher_information_input() Можно ли это реализовать без использования баз данных?

Сразу пришла идея использования текстовых файлов, но тут возникает проблема в том что я не знаю как оттуда извлекать нужную мне информацию. К примеру если при использовании sign in нужно ввести данные, и исходя из них выдается ошибка или предоставляется доступ, то мне нужно взять из файла не все 6 параметров, а только несколько определенных....

main.py:

from prettytable import PrettyTable
from textblob import TextBlob
import sys

pt = PrettyTable(field_names=["name", "surname", "patronymics", "age", "position", "gender"])

class Teacher():
    def teacher_information_input(self):
        self.tname        = str(input("Enter teacher's name: "))
        self.tsurname     = str(input("Enter teacher's surname: "))
        self.tpatronymics = str(input("Enter teacher's patronymics: "))
        self.tage         = float(input("Enter teacher's age: "))
        self.trank        = str(input("Enter teacher's rank: "))
        self.tgender      = str(input("Enter teacher's gender: "))

    def show_teacher_information(self):
        print(pt)

    def add_teacher_information(self):
        pt.add_row(self.tname)
        pt.add_row(self.tsurname)
        pt.add_row(self.tpatronymics)
        pt.add_row(self.tage)
        pt.add_row(self.trank)
        pt.add_row(self.tgender)

    def delete_teacher_information(self):
        print("Nothing here yet")

    def teacher_salary(self):
        print("Nothing here yet")

class Student():
    def student_information_input(self):
        self.ssname       = str(input("Enter student's name: "))
        self.ssurname     = str(input("Enter student's surname: "))
        self.spatronymics = str(input("Enter student's patronymics: "))
        self.sage         = float(input("Enter student's age: "))
        self.sstudy_year  = int(input("Enter student's studying year: "))
        self.sgender      = str(input("Etner student's gender: "))

    def show_student_information(self):
        print("Name:        " + self.sname)
        print("Surname:     " + self.ssurname)
        print("Patronymics: " + self.spatronymics)
        print("Age:         " + self.sage)
        print("Rank:        " + self.srank)
        print("Gender:      " + self.sgender)

    def add_student_information(self):
        print("Nothing here yet")

    def delete_student_information(self):
        print("Nothing here yet")

'''
def correct(string): # function to correct words in inputted string 
    string_list = (string.split(" "))
    correct_list = []

    for word in string_list:
        correct_list.append(TextBlob(word))
    for word in correct_list:
        word.correct()
'''

if __name__ == '__main__':
    t = Teacher()
    s = Student()
    
    print("-------------------------------")
    print("Input:\n  Sign up\n  Sign in\n  Exit")

    while(True):

        choice = str(input("Choice:  "))
        choice.casefold() # converting string into lowercase
        # correct(choice) # using correct function described above to correct a string if needs

        if choice == "exit": 
            sys.exit()

        else:
            if choice == "sign up":
                print("Student | Teacher: ")
                pos_input = str(input("Position: "))
                if pos_input == "teacher":
                    t.teacher_information_input()
                elif pos_input == "student":
                    s.student_information_input()
                
            elif choice == "sign in":
                print("Student | Teacher: ")
                pos_input = str(input("Position: "))
                if pos_input == "teacher" or "Teacher":
                    t.show_teacher_information()
                elif pos_input == "student" or "Student":
                    s.show_student_information()

Ответы (1 шт):

Автор решения: Kers

Для сохранения можно использовать вариант с сериализацией:

import pickle

# Какие-то данные... 
data = {1: "Первый", 2: "Второй", "name": "user"}

# Сохраняем в файл
with open('data.backup', 'wb') as f:
    pickle.dump(data, f)

# Загружаем из файла
with open('data.backup', 'rb') as f:
    load_data = pickle.load(f)

print(load_data)

Немного переписал класс так как он ничего не выводит.

class Teacher():
    def teacher_information_input(self):
        self.tname        = str(input("Enter teacher's name: "))
        self.tsurname     = str(input("Enter teacher's surname: "))
        self.tpatronymics = str(input("Enter teacher's patronymics: "))
        self.tage         = float(input("Enter teacher's age: "))
        self.trank        = str(input("Enter teacher's rank: "))
        self.tgender      = str(input("Enter teacher's gender: "))

# Добавил такой код
    def show_teacher_information(self): 
        print(self.tname)
        print(self.tsurname)
        print(self.tpatronymics)
        print(self.tage)
        print(self.trank)
        print(self.tgender)

    def add_teacher_information(self):
        pt.add_row(self.tname)
        pt.add_row(self.tsurname)
        pt.add_row(self.tpatronymics)
        pt.add_row(self.tage)
        pt.add_row(self.trank)
        pt.add_row(self.tgender)

    def delete_teacher_information(self):
        print("Nothing here yet")

    def teacher_salary(self):
        print("Nothing here yet")

В основном цикле:

if __name__ == '__main__':
    t = Teacher()
    s = Student()

    
    print("-------------------------------")
    print("Input:\n  Sign up\n  Sign in\n  Exit")

    while(True):

        choice = str(input("Choice:  "))
        choice.casefold() # converting string into lowercase
        # correct(choice) # using correct function described above to correct a string if needs

        if choice == "exit": 
            sys.exit()

        else:
            if choice == "sign up":
                print("Student | Teacher: ")
                pos_input = str(input("Position: "))
                if pos_input == "teacher":
                    t.teacher_information_input()
                    with open('data.backup', 'wb') as f: #Сохраним данные
                        pickle.dump(t, f)
                elif pos_input == "student":
                    s.student_information_input()
                
            elif choice == "sign in":
                print("Student | Teacher: ")
                pos_input = str(input("Position: "))
                if pos_input == "teacher" or "Teacher":
                    with open('data.backup', 'rb') as f: # Получаем сохраненные данные
                        load_data2 = pickle.load(f)
                    t = load_data2 # Состояние ВСЕГО класса становится = дампу
                    t.show_teacher_information()
                    

                elif pos_input == "student" or "Student":
                    s.show_student_information()

Не стал разбираться в работе PrettyTable но с выводом информации у вас ошибка. Для наглядности поменял на простые принты. Ну и данные сохраняются для teacher студент делается по аналогии.

→ Ссылка