Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 9.903 ]
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)
Checagem e remoção de arquivos
Manipulando as informações do USBfs no Linux
hicon - Criador de ícones desktop e aplicações do Gnome
Nenhum comentário foi encontrado.
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
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta