Serialização em Python usando pickle

Publicado por Francisco Souza 16/04/2009

[ Hits: 9.760 ]

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

Agenda de compromissos

Them para fluxbox

CHECAGEM && REMOÇÃO -- 2.0

Pyconv - Conversor de codificação de caracteres

ccl - cut and change lines


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts