使用Python 3中的dbm模块

3

我正在学习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)

yields:

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)

出现类型错误:'_dbm.dbm'对象不可迭代。

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

2个回答

2
我认为这取决于它选择使用哪种实现。在我的系统上,Python 3中的dbm选择使用ndbm,它等同于Python 2中的dbm模块。当我显式地使用该模块时,我看到了相同的限制。
似乎Python 2中的anydbm选择dumbdbm,它更慢,但支持完整的字典接口。
您可能需要查看shelve模块,在Python 2和3中都可以使用,它在这些接口之上添加了另一层(允许您存储任何可pickle对象)。

Shelve可以很好地用于迭代数据库,但是使用items和values方法会带来UnpicklingError: unpickling stack underflow的问题。有没有办法在Python 3中访问dumbdbm? - yndolok

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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接