在Python 3中使用dbm模块

3 投票
2 回答
9931 浏览
提问于 2025-04-16 18:46

我正在学习数据库文件和Python 3.1.3中的dbm模块,但在使用Python 2中的anydbm模块的一些方法时遇到了问题。

keys方法运行得很好,

import dbm

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

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

返回结果是:

b'modest'
b'dream'

但是items和values,

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模块中就不能用了?如果是这样的话,有没有其他方法可以替代呢?

2 个回答

1

这种简单数据库的目的是作为键值存储。也就是说,如果你想获取所有的值,就得一个一个地遍历所有的键。比如:

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'
2

我觉得这要看它选择使用哪个实现。在我的系统上,Python 3中的dbm选择使用ndbm,这和Python 2中的dbm模块是一样的。当我明确使用那个模块时,我发现它有相同的限制。

看起来Python 2中的anydbm选择了dumbdbm,这个速度比较慢,但支持完整的字典接口。

你可能还想看看shelve模块,它在Python 2和3中都有,这个模块在这些接口上又增加了一层功能(允许你存储任何可以被序列化的对象)。

撰写回答