Как мне предпринять целочисленные ключи в полве?
-
26-09-2019 - |
Вопрос
Я хочу хранить целочисленный ключ в шелке. Но когда я пытаюсь сохранить целочисленный ключ в положении, это дает мне ошибку
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