我无法删除列表中的项目

问题描述 投票:0回答:1

我正在做大学作业(CRUD),但是,当从列表中删除项目时出现以下错误,我不知道错误是在json的转换中还是在json中的查询中,我已经尝试一切来解决这个问题

Traceback (most recent call last):
  File "C:\Users\souza1.pedro\PycharmProjects\pythonProject\Faculdade.py", line 289, in <module>
    opcao2()
  File "C:\Users\souza1.pedro\PycharmProjects\pythonProject\Faculdade.py", line 206, in opcao2
    if professor["codigo"] == codigo_para_remover:
       ~~~~~~~~~^^^^^^^^^^
TypeError: string indices must be integers, not 'str'

我的代码

import json

# Lista global de estudantes
estudantes = []
professores = []
turmas = []
matriculas = []

# Função para carregar arquivos JSON
def carregar_estudantes():
    global estudantes
    try:
        with open('estudantes.json', 'r', encoding='utf-8') as arquivo:
            estudantes = json.load(arquivo)
            print("Dados dos estudantes carregados com sucesso.")
    except FileNotFoundError:
        print("Arquivo de estudantes não encontrado. Começando com lista vazia.")
        estudantes = []  # Inicializa como lista vazia se não houver arquivo
    except json.JSONDecodeError:
        print("Erro ao decodificar o arquivo de estudantes. Começando com lista vazia.")
        estudantes = []  # Inicializa como lista vazia se houver erro de decodificação

def carregar_professores():
    global professores
    try:
        with open('professores.json', 'r', encoding='utf-8') as arquivo:
            professores = json.load(arquivo)
            print("Dados dos professores carregados com sucesso.")
    except FileNotFoundError:
        print("Arquivo de professores não encontrado. Começando com lista vazia.")
        professores = []  # Inicializa como lista vazia se não houver arquivo
    except json.JSONDecodeError:
        print("Erro ao decodificar o arquivo de professores. Começando com lista vazia.")
        professores = []  # Inicializa como lista vazia se houver erro de decodificação

def carregar_turmas():
    global turmas
    try:
        with open('turmas.json', 'r', encoding='utf-8') as arquivo:
            turmas = json.load(arquivo)
            print("Dados das turmas carregados com sucesso.")
    except FileNotFoundError:
        print("Arquivo de turmas não encontrado. Começando com lista vazia.")
        turmas = []  # Inicializa como lista vazia se não houver arquivo
    except json.JSONDecodeError:
        print("Erro ao decodificar o arquivo de turmas. Começando com lista vazia.")
        turmas = []  # Inicializa como lista vazia se houver erro de decodificação

# Função para salvar todos os dados em seus respectivos arquivos JSON
def salvar_dados():
    global estudantes, professores, turmas, matriculas
    with open('estudantes.json', 'w', encoding='utf-8') as arquivo:
        json.dump(estudantes, arquivo, ensure_ascii=False, indent=4)
    with open('professores.json', 'w', encoding='utf-8') as arquivo:
        json.dump(professores, arquivo, ensure_ascii=False, indent=4)
    with open('turmas.json', 'w', encoding='utf-8') as arquivo:
        json.dump(turmas, arquivo, ensure_ascii=False, indent=4)
    with open('matriculas.json', 'w', encoding='utf-8') as arquivo:
        json.dump(matriculas, arquivo, ensure_ascii=False, indent=4)
    print("Dados salvos com sucesso.")

# Menu Principal
def mostrar_menu():
    print("1. Gerenciar Estudantes")
    print("2. Gerenciar Professores")
    print("3. Gerenciar Turmas")
    print("4. Gerenciar Matrículas")
    print("5. Sair")

# Menu Do Professor
def mostrar_menu_professor():
    print("\nMenu de Professores:")
    print("1. Incluir")
    print("2. Listar")
    print("3. Atualizar")
    print("4. Excluir")
    print("5. Voltar ao Menu Principal")

# Menu Do Estudante
def mostrar_menu_estudante():
    print("\nMenu de Estudantes:")
    print("1. Incluir")
    print("2. Listar")
    print("3. Atualizar")
    print("4. Excluir")
    print("5. Voltar ao Menu Principal")

# Menu Gerenciar matrícula
def menu_gerenciar_matricula():
    print("1. Visualizar matrículas")
    print("2. Editar")
    print("3. Excluir")
    print("4. Voltar ao Menu Principal")

# Gerenciar Turmas
def menu_gerenciar_turma():
    print("1. Incluir")
    print("2. Visualizar")
    print("3. Atualizar turmas")
    print("4. Excluir")
    print("5. Voltar ao Menu Principal")

# Editar código menu
def editar_codigo_estudante():
    global estudantes
    codigo_atual = input("Digite o código atual do estudante: ")
    novo_codigo = input("Digite o novo código do estudante: ")

    for estudante in estudantes:
        if estudante["codigo"] == codigo_atual:
            estudante["codigo"] = novo_codigo
            print(f"Código do estudante {estudante['nome']} atualizado com sucesso.")
            salvar_dados()
            return

    print("Estudante com o código atual não encontrado.")

# Opcao 1 do Menu Principal (submenu)
def opcao1():
    global estudantes

    while True:
        mostrar_menu_estudante()
        escolha_estudante = input("Escolha uma opção do Menu do Estudante: ")

        if escolha_estudante == '1':
            nome_geral = input("Coloque o nome do estudante para incluir: ")
            Turma_geral = input("Coloque o nome da Turma para incluir: ")
            codigo_geral = input("Coloque o código do estudante para incluir: ")
            cpf_geral = input("Coloque o CPF do estudante para incluir: ")

            if len(cpf_geral) != 11:
                print("O CPF deve conter exatamente 11 caracteres. Tente novamente.")
                continue  # Retorna ao menu de estudantes sem adicionar o estudante

            estudantes.append({
                "nome": nome_geral,
                "Turma": Turma_geral,
                "codigo": codigo_geral,
                "cpf": cpf_geral,
            })
            print(f"Estudante {nome_geral} incluído com sucesso.")
            salvar_dados()

        elif escolha_estudante == '2':
            print("Lista de Estudantes:")
            for estudante in estudantes:
                print(estudante)
        elif escolha_estudante == '3':
            editar_codigo_estudante()
        elif escolha_estudante == '4':
            print("Essa área está em desenvolvimento")
        elif escolha_estudante == '5':
            break
        else:
            print("Opção inválida. Tente novamente.")

# Opcao 2 do Menu Principal (submenu)
def opcao2():
    global professores

    while True:
        mostrar_menu_professor()
        escolha_professor = input("Escolha uma opção do Menu de Professores: ")

        if escolha_professor == '1':
            codigo_professor = input("Qual o código do professor:  ")
            nome_professor = input("Qual o nome do professor: ")
            cpf_professor = input("Qual o cpf do professor: ")

            if len(cpf_professor) != 11:
                print("O CPF deve conter exatamente 11 caracteres. Tente novamente.")
                continue  # Retorna ao menu de professores sem adicionar o professor

            # Adiciona um novo professor à lista de professores
            novo_professor = {
                "codigo": codigo_professor,
                "nome": nome_professor,
                "cpf": cpf_professor,
            }
            professores.append(novo_professor)
            print(f"Professor {nome_professor} incluído com sucesso.")
            salvar_dados()

        elif escolha_professor == '2':
            print("Lista de Professores:")
            for professor in professores:
                print(professor)
        elif escolha_professor == '3':
            codigo_atual1 = input("Digite o código atual do professor: ")
            novo_codigo1 = input("Digite o novo código do professor: ")

            for professor in professores:
                if professor["codigo"] == codigo_atual1:
                    professor["codigo"] = novo_codigo1
                    print(f"Código do Professor {professor['nome']} atualizado com sucesso.")
                    salvar_dados()
                    return

            print("Professor com o código atual não encontrado.")
        elif escolha_professor == '4':
            codigo_para_remover = input("Coloque o código do professor para remover: ")

            # Encontrar e remover o professor com o código fornecido
            for professor in professores:
                if professor["codigo"] == codigo_para_remover:
                    professores.remove(professor)
                    print(f"Professor com o código {codigo_para_remover} foi removido.")
                    salvar_dados()
                    break
            else:
                print("Professor com o código fornecido não encontrado.")

        elif escolha_professor == '5':
            break
        else:
            print("Opção inválida. Tente novamente.")

# Opcao 3 do Menu Principal
def opcao3():
    global estudantes, turmas

    while True:
        menu_gerenciar_turma()
        Gerenciador_turma = input("Escolha um número para navegar no menu: ")

        if Gerenciador_turma == '1':
            try:
                id_turma = int(input("Qual o id da turma do professor: "))
                codigo_professor2 = int(input("Qual o código do professor: "))
            except ValueError:
                print("ID da turma e código do professor devem ser números inteiros. Tente novamente.")
                continue

            codigo_disciplina = input("Qual a disciplina do professor: ")

            if not isinstance(codigo_disciplina, str) or len(codigo_disciplina) != 5:
                print("O código da disciplina deve conter exatamente 5 caracteres. Tente novamente.")
                continue  # Retorna ao menu de professores sem adicionar a turma

            turmas.append({
                "ID": id_turma,
                "Nome_Professor": codigo_professor2,
                "Código_disciplina": codigo_disciplina,
            })
            print(f"A turma {id_turma} foi incluída com sucesso.")
            salvar_dados()

        elif Gerenciador_turma == '2':
            print("Lista de Turmas:")
            for turma in turmas:
                print(turma)
        elif Gerenciador_turma == '3':
            codigo_atual2 = input("Digite o código atual da turma: ")
            novo_codigo2 = input("Digite o novo código da turma: ")

            for turma in turmas:
                if turma["Código_disciplina"] == codigo_atual2:
                    turma["Código_disciplina"] = novo_codigo2
                    print(f"Código da Turma {turma['Código_disciplina']} atualizado com sucesso.")
                    salvar_dados()
                    return
        elif Gerenciador_turma == '4':
            print("Área em desenvolvimento")
        elif Gerenciador_turma == '5':
            break
        else:
            print("Opção inválida. Tente novamente.")

# Opcao 4 do Menu Principal
def opcao4():
    print("Menu de Matrículas - Em desenvolvimento")

# Carregar estudantes, professores e turmas no início do programa
carregar_estudantes()
carregar_professores()
carregar_turmas()

# Loop Principal
try:
    while True:
        print("Menu Geral")
        mostrar_menu()
        escolha = input("Escolha uma opção: ")

        if escolha == '1':
            opcao1()
        elif escolha == '2':
            opcao2()
        elif escolha == '3':
            opcao3()
        elif escolha == '4':
            opcao4()
        elif escolha == '5':
            print("Saindo...")
            break
        else:
            print("Opção inválida. Tente novamente.")
except KeyboardInterrupt:
    print("\nPrograma interrompido pelo usuário.")

# Salvar dados ao sair do programa
salvar_dados()

呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜

我尝试转换字符串但不起作用

crud
1个回答
0
投票
为什么出现这个错误:

  1. 错误的数据类型:列表教授可能有字符串,而不是字典,即只有教授。如果 Professores.json 损坏或处理列表的代码中有错误,则可能出现后者。

  2. 无意的更改:但是,当添加、更新和删除讲师(opcao2 函数)等操作发生时,可能会导致教授列表发生无意的更改,其中放置的是字符串而不是字典。

现在,如何克服这个错误?

要解决此问题,请按照以下步骤操作:

    检查数据加载:从 Professores.json 加载数据时,确保 Professors 中的每个条目都是字典。例如,修改您的 carregar_professores 函数如下以强制执行:
def carregar_professores(): 全球教授 尝试: 以 open('professores.json', 'r',encoding='utf-8') 作为 arquivo: 数据 = json.load(arquivo) if isinstance(data, list) 和 all(isinstance(prof, dict) for prof in data): 教授=数据 print("Dados dos Professores carregados com sucesso.") 别的: raise ValueError("O arquivo Professores.json não contém uma lista de dictionários válidos.") 除了文件未找到错误: print("Arquivo de Professores não encontrado. Começando com lista vazia.") Professores = [] # Inicializa como lista vazia se não houver arquivo except (json.JSONDecodeError, ValueError) as e: print(f"Erro ao decodificar o arquivo de Professores: {e}. Começando com lista vazia.") Professores = [] # Inicializa como lista vazia se houver erro de decodificação

在将数据分配给变量 Professor 之前,检查数据是否是字典列表非常重要。如果没有,则提出错误,表明存在问题。

    验证数据一致性:在执行添加、编辑或删除教授等任何活动之前,确保教授仅包含字典。要在您的 opcao2 函数中确保这一点,请按照以下步骤操作:
elif escolha_professor == '4': codigo_para_remover = input("Coloque o código do Professor para remover: ")

# Ensure each professor is a dictionary before accessing keys for professor in professores: if isinstance(professor, dict) and professor.get("codigo") == codigo_para_remover: professores.remove(professor) print(f"Professor com o código {codigo_para_remover} foi removido.") salvar_dados() break else: print("Professor com o código fornecido não encontrado.")
在访问教授的键(professor["codigo"])之前,此代码片段确定教授是否是字典(isinstance(professor, dict))。这可以通过排除非字典条目来避免 TypeError。

    调试和验证:在代码的关键时刻,添加调试打印以检查教授的类型和内容。这有助于确定任何潜在的不正确数据格式的位置和原因。
© www.soinside.com 2019 - 2024. All rights reserved.