Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 9.769 ]
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)
Converte valor de Bytes 2 Kbyte 2 Mbyte
Criando um rootfs para sistemas embarcados a partir de cópia de um sistema já operando
Nenhum comentário foi encontrado.
Atenção a quem posta conteúdo de dicas, scripts e tal (2)
Configuração básica do Conky para mostrar informações sobre a sua máquina no Desktop
Aprenda a criar músicas com Inteligência Artificial usando Suno AI
Entendendo o que é URI, URL, URN e conhecendo as diferenças entre POST e GET
Ativando o Modo Noturno via Linha de Comando no GNOME/Wayland
Habilitando a importação de senhas no Firefox
Como corrigir o erro do VirtualBox travar a máquina virtual em tela cheia
Instalando Google Chrome no Ubuntu 24.04 LTS
Quantidade de caracteres suportados na barra de endereços dos navegadores
Como adicionar módulo de saúde da bateria dos notebooks Acer ao kernel... (32)