整数キーをシェルブに取り込むにはどうすればよいですか?
-
26-09-2019 - |
質問
整数キーをシェルブに保存したい。しかし、整数キーをシェルブに保存しようとすると、エラーが発生します
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