Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 10.261 ]
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)
Leitor de arquivo via linha de comandoEs
Dividir um grupo de arquivos em vários CDs Ou DVDs
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (1)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (1)









