3

我正在学习 Python 3.1.3 中的数据库文件和 dbm 模块,并且在使用 Python 2 中的 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' object is not iterable。

这些方法在 Python 3 的 dbm 模块中不起作用吗?如果这是真的,我还有什么可以代替的吗?

4

2 回答 2

2

我认为这取决于它选择使用哪种实现。在我的系统上,Python 3 中的 dbm 选择使用 ndbm,这相当于dbmPython 2 中的模块。当我明确使用该模块时,我看到了相同的限制。

Python 2中的anydbm似乎选择了dumbdbm,速度较慢,但​​确实支持完整的字典接口。

您可能想查看shelvePython 2 和 3 中的模块,它在这些接口上添加了另一层(允许您存储任何可腌制对象)。

于 2011-06-01T16:37:27.183 回答
1

这些简单数据库的目的是充当键/值存储。如果您想要所有值,则必须遍历所有键。IE:

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

那不会很快。我可能认为这种键/值存储并不是您真正需要的。也许 SQLite 会更好?

也就是说,您可以在 Python 3 中以 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 回答