Exemplo de armazenamento de registros em arquivo
Publicado por Perfil removido (última atualização em 05/05/2010)
[ Hits: 14.094 ]
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
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)
Alternativas ao Multilogin para gerenciamento de múltiplas contas/prof... (0)









