Ver Feed RSS

root@blog:/# chmod o+r *

Python: Shelve - Persistencia de Dados de Forma Simples

Avalie este Post de Blog
A uns dias uma cara no forum abriu essa thread falando que estava precisando criar uma listagem de 20 músicas aleatória baseado nas músicas que ele tem no HD.

Eu ia sugerir um shell-script básico mas ai o PedroArtur sugeriu uma solução com Python. Eu achei legal a solução do Pedro e acabei sugerindo criar um banco de dados simples com o SQLite para tornar o processo mais rápido. O resultado ficou bem legal. Mas até um pouco complexo pra algo simples... QUem quiser ver, o código fonte tá lá. Só não reparem a bagunça, fiz com pressa...

Pensei em usar algumas coisas mais simples, mas como o numero de músicas pode se tornar grande um BD simples foi a melhor opção mesmo. Mas para programas simples, onde a quantidade de dados a ser armazenado é baixo, podemos utilziar uma solução mais Pythoniana: Shelve

O Shelve é um módulo muito útil para quem quer fazer programas que armazenam dados, sejam passados por usuário ou configurações do programa. Um exemplo simples:

Código :
[FONT=Courier New][COLOR=DarkSlateGray]>>> import shelve
>>>
>>> x = 10
>>> y = \"string de teste\"
>>> z = 1.2
>>>
>>> dados = shelve.open(\"dados.db\")
>>> dados[\"x\"] = x
>>> dados[\"y\"] = y
>>> dados[\"z\"] = z
>>> dados.close()
>>>
>>> exit()[/COLOR][/FONT]

Pra quem não entendeu nada disso ai em cima, sugiro antes ler isso aqui.



Explicando o código:

  1. Importei o módulo shelve;
  2. criei os dados x, y e z;
  3. criei um "banco de dados". Esse arquivo dados.db não precisa existir anteriormente, ele é criado no HD, no diretório corrente do programa;
  4. "Inseri" no arquivo dados.db as variáveis x, y e z com os nomes x, y e z;
  5. Fechei o "banco de dados".


Pronto, nossas variáveis x, y e z estão armazenadas! Como pegar elas de volta?? Vamos lá...

Código :
[FONT=Courier New][COLOR=DimGray]>>> import shelve
[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]>>> dados = shelve.open(\"dados.db\")
>>>
>>> x = dados[\"x\"]
>>> y = dados[\"y\"]
>>> z = dados[\"z\"]
>>> print x
10
>>> print y
string de teste
>>> print z
1.2
>>> dados.close()
>>> exit()[/COLOR][/FONT]

Simples não?! Mais simples que usar o Hibernate - persistencia de dados em Java - ou criar arquivos de configuração em C...

A parte mais legal do shelve é que nele você pode guardar qualquer tipo de variável: tuplas, listas, dicionários... A primeira vez que trabalhei com o shelve eu armazenava instâncias de classes . Sério, olha só:

Código :
[FONT=Courier New][COLOR=DimGray]>>> import shelve
>>> class Pessoa:
...  def __init__(self, idade, nome):
...   self.idade = idade
...   self.nome = nome
...
>>> p = Pessoa(23, \"Magnun Leno\")
>>> p.nome
'Magnun Leno'
>>> p.idade
23
>>> dados = shelve.open(\"dados.db\")
>>> dados[\"eu\"] = p
>>> dados.close()
>>> exit()[/COLOR][/FONT]

Agora recuperar a instancia:
Código :
[FONT=Courier New][COLOR=DimGray]>>> import shelve
>>>
>>> class Pessoa:
...  def __init__(self, idade, nome):
...   self.idade = idade
...   self.nome = nome
...
>>> dados = shelve.open(\"dados.db\")
>>> p = dados[\"eu\"]
>>> p.nome
'Magnun Leno'
>>> p.idade
23
>>> dados.close()[/COLOR][/FONT]

Bem, ai está a dica! Façam bom uso!

Atualizado 11-01-2010 em 12:37 por Magnun

Categorias
Dicas , Python , Dicas

Comentários

  1. Avatar de gustavoh
    Muito boa essa dica. Eu tava mesmo querendo salvar configuracoes de um sistema sem ter que ficar manipulando txt e banco de dados. acho que o shelve vai ser bem util.
  2. Avatar de Magnun
    Tem outro muito bom também que cria arquivos de configuração usando sessões e chaves... mas não acho ele tão simples! É mais difícil de manipular também, você tem que ter certeza do tipo do dado. Não é tão automático quanto o shelve...

    Vou ver se depois posto ele por aqui...
  3. Avatar de PEdroArthurJEdi
    Foi meu primeiro script Python
    O problema era bem interessante e ótimo para treinar lists comprehensions

    Veleu pela dica do shelve...
  4. Avatar de Magnun
    Pô... pra um primeiro script foi ótimo!!!

    Também não esperaria menos que alguém que "trabalha" com o Prf. Eriberto...
  5. Avatar de felipeett
    Estou tentando fazer uma agenda usando persistência, mas não estou conseguindo armazenar variáveis do tipo list.
    Você poderia me dar uma ajuda com esse problema
    vlw
  6. Avatar de Magnun
    Olá felipe! Se você está usando o shelve para fazer persistência, tente usa da seguinte maneira:
    Código :
    [FONT=Courier New][COLOR=DimGray]>>> import shelve
    [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]>>> agenda = shelve.open("[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray].db")
    >>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]['fulano'] = ['3234-5678', '3321-1223']
    [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]>>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]['cicrano'] = ['3456-4556'][/COLOR][/FONT]
    [FONT=Courier New][COLOR=DimGray]>>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]['beltrano'] = ['3789-7889']
    >>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray].close()[/COLOR][/FONT]
    Para recuperar os dados faça da seguinte forma:
    Código :
    [FONT=Courier New][COLOR=DimGray]>>> import shelve
    [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]>>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray] = shelve.open("[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray].db")
    >>> for contato em [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]agenda:[/COLOR][/FONT]
    [FONT=Courier New][COLOR=DimGray]>>>     print 'Nome:', contato[/COLOR][/FONT]
    [FONT=Courier New][COLOR=DimGray]>>>     print 'Telefones:', agenda[contato]
    >>>     print[/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]
    >>> agenda.close()[/COLOR][/FONT]
    Qualquer coisa posta ai!
    Até mais...
    Atualizado 16-06-2009 em 07:20 por Magnun

+ Enviar Comentário