Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 9.930 ]
Homepage: http://www.franciscosouza.net
Neste script criei um pequeno e simples sistema de armazenamento de livros que armazena os dados no disco por meio de serialização, utilizando o módulo pickle.
O sistema roda em modo texto, e o código está documentado.
#! /usr/bin/python # coding: utf-8 '''Este módulo cria um pequeno sistema de cadastro de livros usando pickle para serialização. :version: 0.1 :author: Francisco Antônio da Silva Souza :see: http://franciscossouza.blogspot.com ''' # tentando usar o psyco, caso ele esteja instalado try: import psyco psyco.full() except: pass import pickle import sys import os MY_DIR = os.path.dirname(os.path.abspath(__file__)) class Autor(object): '''Classe que modela o autor de um livro. ATRIBUTOS nome (unicode) : nome do autor ''' def __init__(self, nome): '''Este método inicializa o objeto. PARÂMETROS nome (obrigatório) : unicode Nome do autor. ''' if isinstance(nome, unicode): self.nome = nome else: raise TypeError('O atributo nome deve ser do tipo unicode!') class Livro(object): '''Classe que modela um livro no sistema. ATRIBUTOS titulo (unicode) : Título do livro. edicao (int) : Número da edição do livro. autor (Autor) : Objeto que representa o autor do livro. ''' def __init__(self, titulo, edicao, autor): '''Inicializa o objeto. PARÂMETROS titulo (obrigatório) : unicode Título do livro. edicao (obrigatório) : int Edição do livro. autor (obrigatório) : Autor Autor do livro (objeto, e não o nome). ''' if isinstance(titulo, unicode): self.titulo = titulo else: raise TypeError('O atributo titulo deve ser do tipo unicode!') if isinstance(edicao, int): self.edicao = edicao else: raise TypeError('O atributo edicao deve ser do tipo int!') if isinstance(autor, Autor): self.autor = autor else: raise TypeError('O atributo autor deve ser do tipo Autor!') def force_decode(valor): '''Tenta trasnformar uma string em unicode, de forma forçada PARÂMETROS valor (obrigatório) : str Valor a ser transformado em unicode RETORNO Objeto unicode contendo a string transformada. ''' try: resposta = valor.decode('utf-8') except: try: resposta = valor.decode('iso-8859-1') except: resposta = valor return resposta autores = [] livros = [] def carregar_dados(): '''Carrega os dados do arquivo para a memória. ''' global autores global livros try: arquivo_autores = open(MY_DIR + '/autores.db') arquivo_livros = open(MY_DIR + '/livros.db') autores = pickle.load(arquivo_autores) livros = pickle.load(arquivo_livros) arquivo_autores.close() arquivo_livros.close() except IOError: print 'Não existem dados para serem carregados' def inserir_autor(): '''Cadastra um novo autor ''' global autores nome = raw_input('Qual o nome do autor? ') nome = force_decode(nome) autor = Autor(nome) autores.append(autor) print 'Autor %s cadastrado com sucesso!' %nome print def visualizar_autores(): '''Visualiza os autores cadastrados ''' global autores print 'LISTA DE AUTORES' ct = 1 for autor in autores: print '[%d] %s' %(ct, autor.nome) ct += 1 print def inserir_livro(): '''Cadastra um livro no sistema ''' global livros global autores titulo = raw_input('Qual o título do livro? ') titulo = force_decode(titulo) edicao = input('Qual a edição do livro? ') visualizar_autores() cd_autor = input('Selecione o código do autor: ') autor = autores[cd_autor - 1] livro = Livro(titulo, edicao, autor) livros.append(livro) print 'Livro %s cadastrado com sucesso!' %titulo print def visualizar_livros(): '''Lista os livros cadastrados no sistema ''' global livros print 'LISTA DE LIVROS' ct = 1 for livro in livros: print '[%d] %s (Autor: %s, Edicao: %d)' %(ct, livro.titulo, livro.autor.nome, livro.edicao) ct += 1 print def salvar(): '''Salva os dados nos arquivos usando o pickle ''' global livros global autores arquivo_livros = open(MY_DIR + '/livros.db', 'wb') arquivo_autores = open(MY_DIR + '/autores.db', 'wb') pickle.dump(livros, arquivo_livros) pickle.dump(autores, arquivo_autores) arquivo_livros.close() arquivo_autores.close() def apagar_tudo(): '''Apaga os arquivos e limpa a lista de itens ''' os.remove(os.path.join(MY_DIR, 'livros.db')) os.remove(os.path.join(MY_DIR, 'autores.db')) global livros global autores livros = [] autores = [] funcoes = [ inserir_autor, visualizar_autores, inserir_livro, visualizar_livros, salvar, apagar_tudo ] def get_menu(): '''Retorna o texto para o menu. RETORNO: Texto do menu. ''' menu = '''Selecione sua opção: 1 - Inserir um Autor 2 - Visualizar Autores Cadastrados 3 - Inserir um Livro 4 - Visualizar Livros Cadastrados 5 - Salvar os dados no disco 6 - Apagar todos os dados do disco 7 - Sair do sistema Selecione sua opção: ''' return menu def main(args): carregar_dados() resposta = input(get_menu()) while (resposta < 7): resposta -= 1 funcoes[resposta]() resposta = input(get_menu()) print 'Obrigado por usar o programa! :)' if __name__ == '__main__': main(sys.argv)
Organizando suas músicas com Python
Manipulando arquivos com Pickle
Mini-dicionário de termos em Python e PyQT 4
subwrite - um simples editor de texto em Python
Agenda de cadastros com tratamento de erros
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Quero saber sobre os melhores aplicativos de office para usar em 2024 ... (4)
Problemas com o PulseAudio no lubuntu (8)
Som e sistema de janelas não obedecem (1)
Toda vez que tento atualizar o clamav me deparo com erros ao atualizar... (1)