Serialização em Python usando pickle

Publicado por Francisco Souza 16/04/2009

[ Hits: 8.496 ]

Homepage: http://www.franciscosouza.net

Download livraria.py




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.

  



Esconder código-fonte

#! /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)

Scripts recomendados

Hashing com Árvore Binária

Leitura de arquivo com input

Conversor MKV para AVI

DirFileList

Checando se diretorio existe


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts