Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 9.760 ]
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)
Pyconv - Conversor de codificação de caracteres
Nenhum comentário foi encontrado.
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Não consigo acessar os modos de desempenho (2)
Ubuntu — tentando iniciar o windows? (0)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba