2010-10-25 4 views
2

Je souhaite stocker une clé entière dans shelve. Mais lorsque je tente de stocker la clé entier shelve il me donne une erreurComment puis-je prendre des clés entières dans shelve?

 
Traceback (most recent call last): 
    File "./write.py", line 12, in 
    data[id] = {"Id": id, "Name": name} 
    File "/usr/lib/python2.5/shelve.py", line 124, in __setitem__ 
    self.dict[key] = f.getvalue() 
    File "/usr/lib/python2.5/bsddb/__init__.py", line 230, in __setitem__ 
    _DeadlockWrap(wrapF) # self.db[key] = value 
    File "/usr/lib/python2.5/bsddb/dbutils.py", line 62, in DeadlockWrap 
    return function(*_args, **_kwargs) 
    File "/usr/lib/python2.5/bsddb/__init__.py", line 229, in wrapF 
    self.db[key] = value 
TypeError: Integer keys only allowed for Recno and Queue DB's 

Mon code:

#!/usr/bin/python 

import shelve 

data = shelve.open("data.txt") 

ans = 'y' 
while ans == "y": 
    id = input("Enter Id : ") 
    name = raw_input("Enter name : ") 

    data[id] = {"Id": id, "Name": name} 

    ans = raw_input("Do you want to continue (y/n) ? : ") 

data.close() 

quelque chose de mal dans mon programme ou SHELVE ne supporte pas les clés entières du tout?


Edit 1:

Dans le programme que je suis en train de stocker un dictionnaire de voyage et de nom dans un autre dictionnaire avec Id comme une clé. Et puis essayer de le stocker dans un fichier.

Ai-je besoin d'utiliser les DB Recno ou Queue avec shelve? Je suis un débutant et les choses sont confuses. Faites-moi savoir si je ne suis pas clair avec ma question.

Merci.

+0

"shelve ne prend pas en charge les touches entières?" Pourquoi tu demandes ça? Votre message d'erreur indique que "les clés entières ne sont autorisées que pour les DB Recno et Queue". Clairement, les clés entières ** sont ** supportées par les DB Recno et Queue. Que demandez-vous? –

+1

@ S.Lott Je pensais que j'avais besoin de mettre en œuvre Recno ou Queue DB avec shelve, que la raison pour laquelle j'ai demandé "Quelque chose ne va pas dans mon programme ou shelve ne prend pas en charge les touches entières?" – Searock

+0

@ S.Lott J'ai mis à jour ma question. – Searock

Répondre

1

Le module shelve utilise un package de base de données sous-jacent (tel que dbm, gdbm ou bsddb).

Une "étagère" est un objet persistant ressemblant à un dictionnaire. La différence avec les bases de données "dbm" est que les valeurs (et non les clés!) Dans une étagère peuvent être des objets Python essentiellement arbitraires - tout ce que le module pickle peut gérer. Cela inclut la plupart des instances de classe, types de données récursifs et objets contenant beaucoup de sous-objets partagés. Les clés sont des chaînes ordinaires. La section examples vous donne la preuve.

Cela devrait fonctionner. Voici ce que je fais dans mon code -

import shelve 

#Create shelve 
s = shelve.open('test_shelf.db') 
try: 
    s['key1'] = { 'int': 10, 'float':9.5, 'string':'Sample data' } 
finally: 
    s.close() 

#Access shelve 
s = shelve.open('test_shelf.db') 
try: 
    existing = s['key1'] 
finally: 
    s.close() 
print existing 

MISE À JOUR: Vous pouvez essayer le module pickle. Ce n'est pas une base de données de valeurs-clés mais vous pouvez toujours construire votre structure de données en paires clé-valeur et l'envoyer à pickle -

Si vous avez un objet x, et un objet fichier f qui a été ouvert pour l'écriture , la façon la plus simple de décaper l'objet prend une seule ligne de code

pickle.dump(x, f) 

pour unpickle à nouveau l'objet, si f est un objet de fichier qui a été ouvert pour la lecture:

x = pickle.load(f) 

J'entends cPickle est beaucoup plus rapide que pickle. Vous pouvez essayer ceci si vous avez beaucoup de données à stocker.

+0

"key1" n'est-il pas une clé de chaîne? Comment puis-je aller pour une clé entière? – Searock

Questions connexes