3

Python 3.1.3のデータベースファイルとdbmモジュールについて学習していますが、Python2のanydbmモジュールのメソッドのいくつかを使用するのに問題があります。

キーメソッドは正常に機能しますが、

import dbm

db = dbm.open('dbm', 'c')
db['modest'] = 'mouse'
db['dream'] = 'theater'

for key in db.keys():
    print(key)

収量:

b'modest'
b'dream'

しかし、アイテムと価値観、

for k,v in db.items():
    print(k, v)

for val in db.values():
    print(val)

AttributeErrorを発生させます:'_dbm.dbm'オブジェクトには属性'items'がありません。

また、これ:

for key in db:
    print(key)

TypeErrorを取得します:'_dbm.dbm'オブジェクトは反復可能ではありません。

これらのメソッドは、Python 3のdbmモジュールでは機能しませんか?それが本当なら、代わりに使用できるものは他にありますか?

4

2 に答える 2

2

これは、使用する実装を選択するかどうかによって異なると思います。私のシステムでは、Python 3のdbmはndbmを使用することを選択します。これはdbm、Python 2のモジュールと同等です。そのモジュールを明示的に使用すると、同じ制限が表示されます。

Python 2のanydbmはdumbdbmを選択しているようですが、これは低速ですが、完全な辞書インターフェイスをサポートしています。

Python 2と3の両方で、これらのインターフェイス上に別のレイヤーを追加するモジュールを確認shelveすることをお勧めします(ピクルス可能なオブジェクトを格納できるようにします)。

于 2011-06-01T16:37:27.183 に答える
1

この種の単純なデータベースの目的は、キー/値ストアとして機能することです。すべての値が必要な場合は、すべてのキーを反復処理する必要があります。すなわち:

values = [db[key] for key in db.keys()]

それは速くはありません。この種のKey/Valueストアは、実際には必要なものではないように思われるかもしれません。おそらくSQLiteの方が良いでしょうか?

そうは言っても、Python3ではdbm.dumbという名前でdumbdbmにアクセスできます。

>>> import dbm
>>> db = dbm.dumb.open('dbm', 'c')
>>> 
>>> db['modest'] = 'mouse'
>>> db['dream'] = 'theater'
>>> for key in db.keys():
...     print(key)
... 
b'modest'
b'dream'
>>> for k,v in db.items():
...     print(k, v)
... 
b'modest' b'mouse'
b'dream' b'theater'
>>> for val in db.values():
...     print(val)
... 
b'mouse'
b'theater'
于 2011-06-02T04:08:51.353 に答える