Domanda

Voglio memorizzare una chiave intera a ripiano. Ma quando provo a memorizzare interi chiave nel ripiano mi dà un errore

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

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

E 'qualcosa che non va nel mio programma o ripiano non supporti interi chiavi a tutti?


Modifica 1:

In programma Sto cercando di memorizzare un dizionario di Id e nome all'interno di un altro dizionario con Id come chiave. E poi cercando di memorizzare in un file.

Devo utilizzare RECNO o Coda DB insieme con ripiano? Io sono un principiante e le cose sono confuse.

Fammi sapere se non mi è chiaro con la mia domanda.

Grazie.

È stato utile?

Soluzione

Il modulo shelve utilizza un pacchetto database sottostante (come dbm, gdbm o bsddb).

A "scaffale" è una persistente, dizionario-come oggetto. La differenza con i database "DBM" è che i valori (non le chiavi!) In uno scaffale può essere sostanzialmente arbitrario oggetti Python - tutto ciò che il modulo pickle in grado di gestire. Questo include la maggior parte delle istanze di classe, i tipi di dati ricorsive, e gli oggetti che contengono un sacco di sotto-oggetti condivisi. Le chiavi sono stringhe normali. La sezione esempi ti dà la prova.

Questo dovrebbe funzionare. Ecco quello che faccio nel mio codice -

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

UPDATE: Si potrebbe provare modulo pickle. Non è un database chiave-valore, ma si può sempre costruire la vostra struttura dati come coppie chiave-valore e poi inviarlo a pickle -

Se si dispone di un oggetto x, e un f oggetto file che è stato aperto per la scrittura, il modo più semplice per la serializzazione dell'oggetto occupa solo una riga di codice

pickle.dump(x, f)

Per la deserializzazione dell'oggetto, se f è un oggetto file che è stato aperto per la lettura:

x = pickle.load(f)

I Hear cPickle è molto più veloce di pickle. Si può provare questo se si hanno molti dati da memorizzare.

Altri suggerimenti

Nel tuo esempio le chiavi nel database sarà sempre interi, quindi dovrebbe funzionare bene per convertirli in stringhe,

Dati [str (id)] = { "id": id, "Nome": nome}

Il mio codice di prova

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)

E l'uscita; funziona come un dict quindi non è ordinato.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top