Exemplo de armazenamento de registros em arquivo

Publicado por Perfil removido (última atualização em 05/05/2010)

[ Hits: 13.889 ]

Download Ex1SemPickle.py




Exemplo de armazenamento em de registros em arquivos. O código implementa um sistema simplificado de notas e frequência.

  



Esconder código-fonte

# -*- 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")

Scripts recomendados

Leitor de arquivo via linha de comandoEs

Expressão regular com input STDIN

Agenda Python

hicon - Criador de ícones desktop e aplicações do Gnome

Them para fluxbox


  

Comentários
[1] Comentário enviado por ed-borges em 16/02/2021 - 11:25h

Muito bom o código, tentando executar no python3.8 tive que colocar import string, não está ainda 100% mas quando deixar rodando perfeito posto o código, mas tá ajudando muito pois estou começando no python.

Obrigado por compartilhar.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts