Вопрос

Я хочу хранить целочисленный ключ в шелке. Но когда я пытаюсь сохранить целочисленный ключ в положении, это дает мне ошибку

Traceback (последний вызов последний): файл "./write.py", строка 12, в данных [ID] = {«ID»: ID, «Имя»: Имя} Файл "/usr/lib/python2.5/ Shelve.py », Line 124, в __SetiteM__ Self.dict [Key] = f.getValue () Файл" /usr/lib/python2.5/bsddb/__init__.py ", Line 230, в __setiteM__ _deadlockwrap (wrapf) # # self.db [Клавиша] = файл значения "/usr/lib/python2.5/bsddb/dbutils2.5/bsddb/dbutils.py", строка 62, в функции возврата Deadlockwrap (* _ ags, ** _ kwargs) файл "/ usr / lib / python2. 5 / bsddb / __ init__.py ", Line 229, в Wrapf Self.db [Key] = TealError ValueRor: целочисленные ключевые ключи разрешены только для Recno и очередь DB

Мой код:

#!/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()

Что-то не так в моей программе или на полках не поддерживает целочисленные ключи вообще?


Редактировать 1:

В программе я пытаюсь хранить словарь ID и имя внутри другого словаря с идентификатором в качестве ключа. А затем пытаться сохранить его в файле.

Нужно ли использовать recno или queue db вместе с полками? Я новичок, и вещи запутаются.

Дайте мне знать, если я не понятен с моим вопросом.

Спасибо.

Это было полезно?

Решение

Модуль Shelve использует базовый пакет базы данных (например, DBM, GDBM или BSDDB).

«Полка» является постоянным, подобным словарю. Разница с базами данных «DBM» состоит в том, что значения (не клавиши!) На полке могут быть по существу произвольные объекты Python - все, что может обрабатывать модуль сортировки. Это включает в себя большинство экземпляров классов, рекурсивные типы данных и объекты, содержащие множество общих подразделений. Ключи являются обычными строками. То Примеры раздел дает вам доказательство.

Это должно работать. Вот что я делаю в моем коде -

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

ОБНОВИТЬ: Вы могли бы попробовать pickle модуль. Это не база данных ключевых значений, но вы всегда можете создать свою структуру данных как пары ключа, а затем отправить его на pickle -

Если у вас есть объект X, и файл объекта F, который был открыт для написания, самый простой способ сортировать объект, принимает только одну строку кода

pickle.dump(x, f)

Чтобы снова запустить объект, если F - это объект файла, который был открыт для чтения:

x = pickle.load(f)

я слышу cPickle намного быстрее, чем pickle. Отказ Вы можете попробовать это, если у вас есть много данных для хранения.

Другие советы

В вашем примере ключей в вашей базе данных всегда будет целыми числами, поэтому он должен работать нормально, чтобы преобразовать их в строки,

Данные [str (id)] = {"ID": ID, «Имя»: Имя}

Мой тестовый код

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)

И вывод; Работает как диктография, поэтому он не отсортирован.

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top