質問

整数キーをシェルブに保存したい。しかし、整数キーをシェルブに保存しようとすると、エラーが発生します

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

私のコード:

#!/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 をキーとして別の辞書内に ID と名前の辞書を保存しようとしています。そしてそれをファイルに保存しようとします。

Recno または Queue DB をシェルブと一緒に使用する必要がありますか?私は初心者なので混乱しています。

質問が明確でない場合はお知らせください。

ありがとう。

役に立ちましたか?

解決

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 がある場合、オブジェクトをピクルする最も簡単な方法は 1 行のコードだけで済みます。

pickle.dump(x, f)

f が読み取り用に開かれているファイル オブジェクトの場合、オブジェクトを再度 unpickle するには、次のようにします。

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