3

我想在搁置中存储一个整数键。但是当我尝试将整数键存储在搁置中时,它给了我一个错误

回溯(最近一次通话最后):
  文件“./write.py”,第 12 行,在
    数据[id] = {“Id”:id,“名称”:名称}
  文件“/usr/lib/python2.5/shelve.py”,第 124 行,在 __setitem__ 中
    self.dict[key] = f.getvalue()
  文件“/usr/lib/python2.5/bsddb/__init__.py”,第 230 行,在 __setitem__ 中
    _DeadlockWrap(wrapF) # self.db[key] = value
  DeadlockWrap 中的文件“/usr/lib/python2.5/bsddb/dbutils.py”,第 62 行
    返回函数(*_args,**_kwargs)
  文件“/usr/lib/python2.5/bsddb/__init__.py”,第 229 行,在 wrapF
    self.db[键] = 值
TypeError:整数键只允许用于 Recno 和 Queue 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 和 Name 的字典存储在另一个以 Id 作为键的字典中。然后尝试将其存储在文件中。

我需要将 Recno 或 Queue DB 与搁置一起使用吗?我是初学者,事情很混乱。

如果我不清楚我的问题,请告诉我。

谢谢。

4

2 回答 2

2

在您的示例中,数据库中的键始终是整数,因此将它们转换为字符串应该可以正常工作,

数据[str(id)] = {"Id": id, "Name": name}

我的测试代码

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
于 2018-07-06T16:52:15.017 回答
1

shelve 模块使用底层数据库包(例如 dbm、gdbm 或 bsddb)。

“架子”是一个持久的、类似字典的对象。与“dbm”数据库的区别在于架子中的值(不是键!)本质上可以是任意 Python 对象——pickle 模块可以处理的任何东西。这包括大多数类实例、递归数据类型和包含大量共享子对象的对象。键是普通字符串。示例部分为您提供了证明。

这应该有效。这是我在我的代码中所做的 -

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)

我听说cPicklepickle. 如果您有大量数据要存储,您可以试试这个。

于 2010-10-25T09:59:59.997 回答