Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 9.968 ]
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)
subwrite - um simples editor de texto em Python
Checagem e remoção de arquivos
Nenhum comentário foi encontrado.
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Encontre seus arquivos facilmente com o Drill
Mouse Logitech MX Ergo Advanced Wireless Trackball no Linux
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
VMs e Interfaces de Rede desapareceram (12)
Instalação do drive do adaptador wiffi (7)