Exemplo de armazenamento de registros em arquivo
Publicado por Perfil removido (última atualização em 05/05/2010)
[ Hits: 13.879 ]
Exemplo de armazenamento em de registros em arquivos. O código implementa um sistema simplificado de notas e frequência.
# -*- coding: utf-8 -*- import os, collections #Versão Sem Pickle #Observação: a variável limpar armazena o comando do sistema operacional responsável pela limpeza de tela limpar = "clear" alunosPath = "ALUNOS.DAT" disciplinasPath = "DISCIPLI.DAT" def ArquivoExiste(arquivo): try: f = open(arquivo, "rb") except IOError: return False f.close() return True def ExisteCodigo(arquivo, campo, codigo): f = open(arquivo, "rb") dicString = "" while True: ch = f.read(1) if ch == "#": dic = eval(dicString) dicString = "" if dic[campo] == codigo: return True else: dicString += ch if ch == "": break f.close() return False def incluirAluno(): tipoAluno = collections.namedtuple("Aluno", "ra nome codigoDisciplina nota1 nota2 nota3 nota4 faltas") os.system(limpar) print("CADASTRO DE ALUNOS") while True: try: while True: ra = int(input("Digite o RA do aluno que deseja cadastrar: ")) if ExisteCodigo(alunosPath, "ra", ra): print("O RA inserido já está cadastrado!") else: break except: print("Erro: o RA deve ser um número inteiro!") else: break while True: try: while True: codigoDisciplina = int(input("Digite o código da disciplina: ")) if not ExisteCodigo(disciplinasPath, "codigo", codigoDisciplina): print("A disciplina inserida não está cadastrada! Para cadastrar um disciplina, escolha a opção 4 no menu principal") input("Digite qualquer número para continuar: ") return else: break except: print("Erro: o código da disciplina deve ser um número inteiro") else: break while True: try: nome = raw_input("Digite o nome do aluno: ") except: print("Erro: o nome do aluno deve ser digitado entre aspas") else: break while True: try: nota1 = float(input("Entre com a nota 1: ")) nota2 = float(input("Entre com a nota 2: ")) nota3 = float(input("Entre com a nota 3: ")) nota4 = float(input("Entre com a nota 4: ")) except: print("Erro: as notas devem ser números reais entre 0 e 10") else: if ((nota1 or nota2 or nota3 or nota4) < 0.0) or ((nota1 or nota2 or nota3 or nota4) > 10.0): print("As notas devem estar entre 0 e 10, favor reinserí-las na faixa correta:") continue else: break while True: try: faltas = int(input("Entre com as faltas do aluno na disciplina: ")) except: print("Erro: o código da disciplina deve ser um número inteiro") else: break aluno = tipoAluno(ra, nome, codigoDisciplina, nota1, nota2, nota3, nota4, faltas) os.system(limpar) print("CADASTRO DE ALUNOS") print("Dados inseridos: \n") print("RA: "+str(ra)) print("Nome: "+str(nome)) f = open(disciplinasPath, "rb") dicString = "" while True: ch = f.read(1) if ch == "#": dic = eval(dicString) dicString = "" if codigoDisciplina == dic['codigo']: disciplinaNome = dic['nome'] break else: dicString += ch if ch == "": break f.close() print("Disciplina: "+str(codigoDisciplina)+" - "+disciplinaNome) print("Nota 1: "+str(nota1)) print("Nota 2: "+str(nota2)) print("Nota 3: "+str(nota3)) print("Nota 4: "+str(nota4)) print("Número de faltas: "+str(faltas)) while True: try: inserir = int(input("Digite 1 para gravar ou qualquer outro número para cancelar: ")) except: print("Erro: a opção deve ser um número inteiro") else: break if inserir == 1: f = open(alunosPath, "a") f.write(str(aluno._asdict())) f.write("#") f.close() return def listarAlunos(): f = open(alunosPath, "rb") dicString = "" print("Listando alunos: \n") linhasUsadas = 3 flagImprimiu = False while True: ch = f.read(1) if ch == "#": dic = eval(dicString) dicString = "" if linhasUsadas == 19: input("Digite qualquer número para continuar: ") linhasUsadas = 0 os.system(limpar) print("RA: "+str(dic['ra'])), print(" Nome: "+str(dic['nome'])) flagImprimiu = True linhasUsadas += 1 else: dicString += ch if ch == "": break f.close() if not flagImprimiu: print("Não há alunos cadastrados") return def listarDisciplinas(pesos=False): f = open(disciplinasPath, "rb") dicString = "" print("Listando disciplinas: \n") linhasUsadas = 3 flagImprimiu = False while True: ch = f.read(1) if ch == "#": dic = eval(dicString) dicString = "" if linhasUsadas == 19: input("Digite qualquer número para continuar: ") linhasUsadas = 0 os.system(limpar) if pesos: print(str(dic['codigo'])), print(" "+str(dic['nome'])), print("P1:"+str(dic['peso1'])), print("P2:"+str(dic['peso2'])), print("P3:"+str(dic['peso3'])), print("P4:"+str(dic['peso4'])) else: print("Código: "+str(dic['codigo'])), print(" Nome: "+str(dic['nome'])) linhasUsadas += 1 flagImprimiu = True else: dicString += ch if ch == "": break f.close() if not flagImprimiu: print("Não há disciplinas cadastradas") return def excluirAluno(): os.system(limpar) print("EXCLUSÃO DE ALUNOS") listarAlunos() raExcluir = input("\nDigite o RA do aluno o qual deseja excluir ou 0 para retornar: ") f = open(alunosPath, "r+b") dicString = "" somaCaracteres = 0 if raExcluir != 0: while True: ch = f.read(1) somaCaracteres += 1 if ch == "#": dic = eval(dicString) if dic['ra'] == raExcluir: f.seek(somaCaracteres-len(dicString)-1) for i in range(len(dicString)+1): f.write(" ") break dicString = "" else: dicString += ch if ch == "": break f.close() return def alterarNotas(): os.system(limpar) print("ALTERAR NOTAS DE ALUNOS") alunos = listarAlunos() raAlterar = input("\nDigite o RA do aluno o qual deseja alterar as notas ou 0 para retornar: ") if raAlterar != 0: f = open(alunosPath, "r+b") dicString = "" somaCaracteres = 0 while True: ch = f.read(1) somaCaracteres += 1 if ch == "#": dic = eval(dicString) if dic['ra'] == raAlterar: os.system(limpar) print("ALTERAR NOTAS DE ALUNOS") print("\nAlterando notas do aluno: "+str(dic['nome'])) while True: try: nota1 = float(input("Entre com a nota 1: ")) nota2 = float(input("Entre com a nota 2: ")) nota3 = float(input("Entre com a nota 3: ")) nota4 = float(input("Entre com a nota 4: ")) except: print("Erro: as notas devem ser números reais entre 0 e 10") else: if ((nota1 or nota2 or nota3 or nota4) < 0.0) or ((nota1 or nota2 or nota3 or nota4) > 10.0): print("As notas devem estar entre 0 e 10, favor reinserí-las na faixa correta:") continue else: break os.system(limpar) print("ALTERAR NOTAS DE ALUNOS") print("Novas notas inseridas: \n1a: "+str(nota1)+"\n2a: "+str(nota2)+"\n3a: "+str(nota3)+"\n4a: "+str(nota4)) confirmacao = input("Pressione 1 para confirmar alteração ou qualquer número para cancelar: ") if confirmacao == 1: dic['nota1'] = nota1 dic['nota2'] = nota2 dic['nota3'] = nota3 dic['nota4'] = nota4 f.seek(somaCaracteres-len(dicString)-1) for i in range(len(dicString)+1): f.write(" ") f.seek(f.tell()) f.write(str(dic)) f.write("#") dicString = "" else: dicString += ch if ch == "": break f.close() return def incluirDisciplina(): tipoDisciplina = collections.namedtuple("Disciplina", "codigo nome peso1 peso2 peso3 peso4 cargaHoraria") os.system(limpar) print("CADASTRO DE DISCIPLINAS") while True: try: while True: codigo = int(input("Digite o código da disciplina que deseja cadastrar: ")) if ExisteCodigo(disciplinasPath, "codigo", codigo): print("O código inserido já está cadastrado!") else: break except: print("Erro: o código deve ser um número inteiro!") else: break while True: try: nome = raw_input("Digite o nome da disciplina: ") except: print("Erro: o nome da disciplina deve ser digitado entre aspas") else: break while True: try: peso1 = float(input("Entre com o peso da avaliação 1 ou 0 se não houver avaliação: ")) peso2 = float(input("Entre com o peso da avaliação 2 ou 0 se não houver avaliação: ")) peso3 = float(input("Entre com o peso da avaliação 3 ou 0 se não houver avaliação: ")) peso4 = float(input("Entre com o peso da avaliação 4 ou 0 se não houver avaliação: ")) except: print("Erro: os pesos das avaliações devem ser números reais") else: break while True: try: cargaHoraria = int(input("Entre com a carga horária da disciplina: ")) except: print("Erro: a carga horária da disciplina deve ser um número inteiro") else: break disciplina = tipoDisciplina(codigo, nome, peso1, peso2, peso3, peso4, cargaHoraria) os.system(limpar) print("CADASTRO DE DISCIPLINAS") print("Dados inseridos: \n") print("Código: "+str(codigo)) print("Nome: "+str(nome)) print("Peso da Avaliação 1: "+str(peso1)) print("Peso da Avaliação 2: "+str(peso2)) print("Peso da Avaliação 3: "+str(peso3)) print("Peso da Avaliação 4: "+str(peso4)) print("Carga horária da disciplina: "+str(cargaHoraria)) while True: try: inserir = int(input("Digite 1 para gravar ou qualquer outro número para cancelar: ")) except: print("Erro: a opção deve ser um número inteiro") else: break if inserir == 1: f = open(disciplinasPath, "ab") f.write(str(disciplina._asdict())) f.write("#") f.close() return def excluirDisciplina(): os.system(limpar) print("EXCLUSÃO DE DISCIPLINAS") listarDisciplinas() codigoExcluir = input("\nDigite o código da disciplina a qual deseja excluir ou 0 para retornar: ") if codigoExcluir != 0: f = open(alunosPath, "rb") dicString = "" somaCaracteres = 0 while True: ch = f.read(1) somaCaracteres += 1 if ch == "#": dic = eval(dicString) if dic['codigoDisciplina']==codigoExcluir: print("A disciplina selecionada não pode ser excluída, pois está cadastrada para alguns alunos") input("Digite qualquer número para continuar: ") return dicString = "" else: dicString += ch if ch == "": break f.close() f = open(disciplinasPath, "r+b") dicString = "" somaCaracteres = 0 while True: ch = f.read(1) somaCaracteres += 1 if ch == "#": dic = eval(dicString) if dic.get('codigo', -1) == codigoExcluir: f.seek(somaCaracteres-len(dicString)-1) for i in range(len(dicString)+1): f.write(" ") break dicString = "" else: dicString += ch if ch == "": break f.close() return def consultaAlunos(opcaoConsulta=""): os.system(limpar) print("MENU DE CONSULTAS\n") print("Listando: ") linhasUsadas = 3 f = open(alunosPath, "rb") dicString = "" while True: ch = f.read(1) if ch == "#": dic = eval(dicString) somaNotas = 0.0 somaPesos = 0.0 frequencia = 0.0 fDisciplinas = open(disciplinasPath, "rb") dicStringDisciplinas = "" while True: chDisciplinas = fDisciplinas.read(1) if chDisciplinas == "#": dicDisciplinas = eval(dicStringDisciplinas) if dicDisciplinas['codigo'] == dic['codigoDisciplina']: for i in range(1,5): somaNotas += dicDisciplinas['peso'+str(i)]*dic['nota'+str(i)] somaPesos += dicDisciplinas['peso'+str(i)] frequencia = float(dicDisciplinas['cargaHoraria'] - dic['faltas'])/float(dicDisciplinas['cargaHoraria']) media = somaNotas/somaPesos dicStringDisciplinas = "" else: dicStringDisciplinas += chDisciplinas if chDisciplinas == "": break fDisciplinas.close() if linhasUsadas == 19: input("Digite qualquer número para continuar: ") os.system(limpar) linhasUsadas = 0 if opcaoConsulta=="aprovados": if media >= 6 and frequencia >= 0.75: print("RA: "+str(dic['ra'])+" Nome: "+dic['nome']+" Média: "+str(media)) elif opcaoConsulta=="exame": if media < 6 and frequencia >= 0.75: print("RA: "+str(dic['ra'])+" Nome: "+dic['nome']+" Média: "+str(media)) else: print("RA: "+str(dic['ra'])+" Nome: "+dic['nome']+" Média: "+str(media)) linhasUsadas += 1 dicString = "" else: dicString += ch if ch == "": break f.close() input("Digite qualquer número para continuar: ") return def consultaAlunosDisciplina(): os.system(limpar) print("MENU DE CONSULTAS\n") listarDisciplinas() opcaoDisciplina = input("Digite o código da disciplina a qual deseja ver os alunos: ") os.system(limpar) print("MENU DE CONSULTAS\n") if not ExisteCodigo(disciplinasPath, "codigo", opcaoDisciplina): return print("Listando alunos da disciplina escolhida: ") linhasUsadas = 3 f = open(alunosPath, "rb") dicString = "" while True: ch = f.read(1) if ch == "#": dic = eval(dicString) dicString = "" if dic['codigoDisciplina'] == opcaoDisciplina: if linhasUsadas == 19: input("Digite qualquer número para continuar: ") linhasUsadas = 0 print("RA: "+str(dic['ra'])+" Nome: "+dic['nome']) linhasUsadas += 1 else: dicString += ch if ch == "": break f.close() input("Digite qualquer número para continuar: ") return def consulta(): opcaoConsulta = 0 while opcaoConsulta != 6: os.system(limpar) print("MENU DE CONSULTAS\n") print("1. Todos Alunos") print("2. Alunos Aprovados") print("3. Alunos para Exame") print("4. Disciplinas e Pesos") print("5. Alunos por disciplina") print("6. Voltar") opcaoConsulta = input("\nEscolha uma opção válida (1 a 6): ") if opcaoConsulta == 1: consultaAlunos() if opcaoConsulta == 2: consultaAlunos("aprovados") if opcaoConsulta == 3: consultaAlunos("exame") if opcaoConsulta == 4: os.system(limpar) print("MENU DE CONSULTAS") listarDisciplinas(True) input("Digite qualquer número para continuar: ") if opcaoConsulta == 5: consultaAlunosDisciplina() return if not ArquivoExiste(alunosPath): fAlunos = open(alunosPath, "wb") fAlunos.write("") fAlunos.close() if not ArquivoExiste(disciplinasPath): fDisciplinas = open(disciplinasPath, "wb") fDisciplinas.write("") fDisciplinas.close() opcao = 0 while opcao != 7: try: os.system(limpar) print("CONTROLE DE NOTAS E FREQUÊNCIA\n") print("1. Incluir Aluno") print("2. Excluir Aluno") print("3. Alterar Notas") print("4. Incluir Disciplina") print("5. Excluir Disciplina") print("6. Consultar") print("7. Sair") opcao = input("\nEscolha uma opção válida (1 a 7): ") if opcao==1: incluirAluno() elif opcao==2: excluirAluno() elif opcao==3: alterarNotas() elif opcao==4: incluirDisciplina() elif opcao==5: excluirDisciplina() elif opcao==6: consulta() except: print("Opção inválida")
Juntando tabelas em aquivo texto
Mini-dicionário de termos em Python e PyQT 4
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Melhorando a precisão de valores flutuantes em python[RESOLV... (15)
Mint começou a apresentar varios erros (2)
Recuperar arquivos de HD em formato RAW usando Linux (1)