Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Extreme Multimidia
Por davi182
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Scripts

Linux user

Publicado por Francisco Souza em 16/04/2009    [ 3475 hits ]

Login: franciscosouza, 70030 pontos

Homepage: http://www.franciscosouza.net   


Descrição

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.

[ Download: livraria.py ]   [ Enviar nova versão ]

[ 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
   Script Linux recomendado Leitor de arquivo via linha de comandoEs
   Script Linux recomendado Miojo Notepad 0.3
   Script Linux recomendado Converte valor de Bytes 2 Kbyte 2 Mbyte
   Script Linux recomendado Checando se diretorio existe
   Script Linux recomendado Calculador de Frequência

Comentários
Nenhum comentário foi encontrado.

Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.