Question

Je veux stocker une clé entière dans shelve. Mais lorsque je tente de stocker la clé entier shelve il me donne une erreur

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()

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


Modifier 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.

Dois-je utiliser RECNO ou DB de file d'attente avec shelve? Je suis un débutant et les choses sont source de confusion.

Permettez-moi de savoir si je ne suis pas clair avec ma question.

Merci.

Était-ce utile?

La solution

Le module d'étagère utilise un ensemble de bases de données sous-jacent (comme dbm, gdbm ou bsddb).

« étagère » est un objet persistant, dictionnaire comme. La différence avec les bases de données « dbm » est que les valeurs (pas 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 cas de classe, les types de données récursives et des objets contenant beaucoup de sous-objets partagés. Les touches sont des chaînes ordinaires. La section

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 de module pickle. Il n'est pas une base de données de valeur clé, mais vous pouvez toujours construire votre structure de données en tant que paires clé-valeur, puis 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 l'objet à nouveau, 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 si vous avez beaucoup de données à stocker.

Autres conseils

Dans votre exemple les clés de votre base de données seront toujours entiers, donc il devrait fonctionner correctement pour les convertir en chaînes,

données [str (id)] = { "id": id, "Nom": name}

Mon code de test

def shelve_some_data(filename):
    db = shelve.open(filename, flag="c")
    try:
        # note key has to be a string
        db[str(1)]    = "1 integer key that's been stringified" 
        db[str(2)]    = "2 integer key that's been stringified" 
        db[str(3)]    = "3 integer key that's been stringified" 
        db[str(10)]   = "10 integer key that's been stringified" 
    finally:
        db.close()

def whats_in(filename):
    db = shelve.open(filename, flag="r")
    for k in db:
        print("%s : %s" % (k, db[k]))
    return

filename = "spam.db"
shelve_some_data(filename)
whats_in(filename)

Et la sortie; il fonctionne comme un dict il est donc pas triée.

2 : 2 integer key that's been stringified
10 : 10 integer key that's been stringified
1 : 1 integer key that's been stringified
3 : 3 integer key that's been stringified
scroll top