Serialização em Python usando pickle
Publicado por Francisco Souza 16/04/2009
[ Hits: 10.196 ]
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)
Expressão regular com input STDIN
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
VOL já não é mais como antes? (9)
É normal não gostar de KDE? (13)
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (15)
Secure boot, artigo interessante, nada técnico. (4)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









