Manipulando arquivos com Pickle
Publicado por Perfil removido (última atualização em 05/05/2010)
[ Hits: 9.616 ]
Exemplo de manipulação de arquivos em Python com a classe Pickle. O código se trata de um sistema simplificado de notas e frequência com armazenamento em arquivos.
# -*- coding: utf-8 -*-
import os, collections, 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, "r")
except IOError:
return False
f.close()
return True
def ExisteCodigo(tabela, campo, codigo):
for el in tabela:
if el[campo] == codigo:
return True
return False
def incluirAluno(alunos, disciplinas):
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(alunos, "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(disciplinas, "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 = input("Digite o nome do aluno (entre aspas): ")
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))
for el in disciplinas:
if el['codigo'] == codigoDisciplina:
disciplinaNome = el['nome']
break
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:
alunos += [aluno._asdict()]
f = open(alunosPath, "w")
pickle.dump(alunos, f)
f.close()
return
def listarAlunos():
f = open(alunosPath, "r")
alunos = pickle.load(f)
f.close()
print("Listando alunos: \n")
linhasUsadas = 3
if len(alunos) == 0:
print("Não há alunos cadastrados")
for i in range(len(alunos)):
if linhasUsadas == 19:
input("Digite qualquer número para continuar: ")
linhasUsadas = 0
os.system(limpar)
print("RA: "+str(alunos[i]['ra'])),
print(" Nome: "+str(alunos[i]['nome']))
linhasUsadas += 1
return alunos
def listarDisciplinas(pesos=False):
f = open(disciplinasPath, "r")
listaDisciplinas = pickle.load(f)
f.close()
print("Listando disciplinas: \n")
linhasUsadas = 3
if len(listaDisciplinas) == 0:
print("Não há disciplinas cadastradas")
for i in range(len(listaDisciplinas)):
if linhasUsadas == 19:
input("Digite qualquer número para continuar: ")
linhasUsadas = 0
os.system(limpar)
if pesos:
print(str(listaDisciplinas[i]['codigo'])),
print(" "+str(listaDisciplinas[i]['nome'])),
print("P1:"+str(listaDisciplinas[i]['peso1'])),
print("P2:"+str(listaDisciplinas[i]['peso2'])),
print("P3:"+str(listaDisciplinas[i]['peso3'])),
print("P4:"+str(listaDisciplinas[i]['peso4']))
else:
print("Código: "+str(listaDisciplinas[i]['codigo'])),
print(" Nome: "+str(listaDisciplinas[i]['nome']))
linhasUsadas += 1
return listaDisciplinas
def excluirAluno(alunos):
os.system(limpar)
print("EXCLUSÃO DE ALUNOS")
listarAlunos()
raExcluir = input("\nDigite o RA do aluno o qual deseja excluir ou 0 para retornar: ")
if raExcluir != 0:
for i in range(len(alunos)):
if alunos[i]['ra'] == raExcluir:
alunos.remove(alunos[i])
f = open(alunosPath, "w")
pickle.dump(alunos, f)
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:
for i in range(len(alunos)):
if alunos[i]['ra'] == raAlterar:
os.system(limpar)
print("ALTERAR NOTAS DE ALUNOS")
print("\nAlterando notas do aluno: "+str(alunos[i]['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:
alunos[i]['nota1'] = nota1
alunos[i]['nota2'] = nota2
alunos[i]['nota3'] = nota3
alunos[i]['nota4'] = nota4
break
f = open(alunosPath, "w")
pickle.dump(alunos, f)
f.close()
return
def incluirDisciplina(disciplinas):
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(disciplinas, "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 = input("Digite o nome da disciplina (entre aspas): ")
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:
disciplinas += [disciplina._asdict()]
f = open(disciplinasPath, "w")
pickle.dump(disciplinas, f)
f.close()
return
def excluirDisciplina(alunos, disciplinas):
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:
for el in alunos:
if el['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
for i in range(len(disciplinas)):
if disciplinas[i]['codigo'] == codigoExcluir:
disciplinas.remove(listaDisciplinas[i])
f = open(disciplinasPath, "w")
pickle.dump(disciplinas, f)
f.close()
return
def consultaAlunos(alunos, disciplinas, opcaoConsulta=""):
os.system(limpar)
print("MENU DE CONSULTAS\n")
print("Listando: ")
linhasUsadas = 3
for elAluno in alunos:
posDisciplina = 0
somaNotas = 0.0
somaPesos = 0.0
frequencia = 0.0
for i in range(len(disciplinas)):
if disciplinas[i]['codigo'] == elAluno['codigoDisciplina']:
posDisciplina = i
for i in range(1,5):
somaNotas += disciplinas[posDisciplina]['peso'+str(i)]*elAluno['nota'+str(i)]
somaPesos += disciplinas[posDisciplina]['peso'+str(i)]
frequencia = float(disciplinas[posDisciplina]['cargaHoraria'] - elAluno['faltas'])/float(disciplinas[posDisciplina]['cargaHoraria'])
media = somaNotas/somaPesos
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(elAluno['ra'])+" Nome: "+elAluno['nome']+" Média: "+str(media))
elif opcaoConsulta=="exame":
if media < 6 and frequencia >= 0.75:
print("RA: "+str(elAluno['ra'])+" Nome: "+elAluno['nome']+" Média: "+str(media))
else:
print("RA: "+str(elAluno['ra'])+" Nome: "+elAluno['nome']+" Média: "+str(media))
linhasUsadas += 1
input("Digite qualquer número para continuar: ")
return
def consultaAlunosDisciplina(alunos, disciplinas):
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(disciplinas, "codigo", opcaoDisciplina):
return
for el in disciplinas:
if el['codigo'] == opcaoDisciplina:
disciplinaNome = el['nome']
print("Listando alunos da disciplina: "+disciplinaNome)
linhasUsadas = 3
for el in alunos:
if el['codigoDisciplina'] == opcaoDisciplina:
if linhasUsadas == 19:
input("Digite qualquer número para continuar: ")
linhasUsadas = 0
print("RA: "+str(el['ra'])+" Nome: "+el['nome'])
linhasUsadas += 1
input("Digite qualquer número para continuar: ")
return
def consulta(alunos, disciplinas):
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(alunos, disciplinas)
if opcaoConsulta == 2:
consultaAlunos(alunos, disciplinas, "aprovados")
if opcaoConsulta == 3:
consultaAlunos(alunos, disciplinas, "exame")
if opcaoConsulta == 4:
os.system(limpar)
print("MENU DE CONSULTAS")
listarDisciplinas(True)
input("Digite qualquer número para continuar: ")
if opcaoConsulta == 5:
consultaAlunosDisciplina(alunos, disciplinas)
return
if not ArquivoExiste(alunosPath):
fAlunos = open(alunosPath, "w")
listaAlunos = []
pickle.dump(listaAlunos,fAlunos)
fAlunos.close()
if not ArquivoExiste(disciplinasPath):
fDisciplinas = open(disciplinasPath, "w")
listaDisciplinas = []
pickle.dump(listaDisciplinas,fDisciplinas)
fDisciplinas.close()
opcao = 0
while opcao != 7:
fAlunos = open(alunosPath, "r")
fDisciplinas = open(disciplinasPath, "r")
listaAlunos = pickle.load(fAlunos)
listaDisciplinas = pickle.load(fDisciplinas)
fAlunos.close()
fDisciplinas.close()
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(listaAlunos, listaDisciplinas)
elif opcao==2:
excluirAluno(listaAlunos)
elif opcao==3:
alterarNotas()
elif opcao==4:
incluirDisciplina(listaDisciplinas)
elif opcao==5:
excluirDisciplina(listaAlunos, listaDisciplinas)
elif opcao==6:
consulta(listaAlunos, listaDisciplinas)
except NameError:
print("Opção inválida")
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
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Não consigo instalar distro antiga no virtualbox nem direto no hd (9)
Quais os códigos mais dificeis que vcs sabem fazer? (5)
Fiz uma pergunta no fórum mas não consigo localizar (14)
Upscaling com imagem cortada no monitor secundário ao usar iGPU Multi ... (1)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... [RES... (8)









