Exemplo de armazenamento de registros em arquivo
Publicado por Perfil removido (última atualização em 05/05/2010)
[ Hits: 14.143 ]
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")
Organizando suas músicas com Python
Serialização em Python usando pickle
Descobrir HOME do usuario e criar arquivo de configuração
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com som ruim no Pipewire
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Como programar um sistema de controle para distribuições linux em c? (5)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)









