我正在学习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'对象不可迭代。
这些方法在Python 3中的dbm模块中不起作用吗?如果这是真的,那还有什么我可以使用吗?
答案 0 :(得分:2)
我认为这取决于它选择使用哪种实现方式。在我的系统上,Python 3中的dbm选择使用ndbm,这相当于Python 2中的dbm
模块。当我明确使用该模块时,我看到了相同的限制。
似乎Python 2中的anydbm选择dumbdbm,这个速度较慢,但确实支持完整的字典界面。
您可能希望查看Python 2和3中的shelve
模块,它在这些接口上添加了另一层(允许您存储任何可pickle对象)。
答案 1 :(得分: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'