Exemplo de armazenamento de registros em arquivo
Publicado por Perfil removido (última atualização em 05/05/2010)
[ Hits: 13.870 ]
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")
Descobrir HOME do usuario e criar arquivo de configuração
Leitor de arquivo via linha de comandoEs
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
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Mensagem quando tento fazer o apt update && apt upgrade no kal... (0)
Modernização e Avanço do Linux. (22)
Recuperando arquivo corrompido no cartão de memoria pelo linux [RESOLV... (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta