3

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

トレースバック (最新の呼び出しが最後):
  ファイル「./write.py」の 12 行目
    data[id] = {"ID": id、"名前": 名前}
  ファイル "/usr/lib/python2.5/shelve.py"、124 行目、__setitem__ 内
    self.dict[キー] = f.getvalue()
  ファイル "/usr/lib/python2.5/bsddb/__init__.py"、230 行目、__setitem__ 内
    _DeadlockWrap(wrapF) # self.db[キー] = 値
  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 をキーとして別の辞書内に ID と名前の辞書を格納しようとしています。そして、それをファイルに保存しようとしています。

shelve と一緒に Recno または Queue DB を使用する必要がありますか? 私は初心者で、物事が混乱しています。

質問がはっきりしない場合はお知らせください。

ありがとう。

4

2 に答える 2

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

pickle.dump(x, f)

オブジェクトを再度 unpickle するには、 f が読み取り用に開かれたファイル オブジェクトである場合:

x = pickle.load(f)

cPickleよりもずっと速いと聞きましたpickle。保存するデータが多い場合は、これを試すことができます。

于 2010-10-25T09:59:59.997 に答える