在Python 3中使用dbm模块

2024-04-27 00:43:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但物品和价值观

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:“\u dbm.dbm”对象不可iterable。

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


Tags: 模块对象方法keyin数据库fordb
2条回答

此类简单数据库的目的是充当键/值存储。如果你想要所有的值,你必须迭代所有的键。即:

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'

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

Python 2中的任何dbm都选择dumbdbm,虽然速度较慢,但确实支持完整的dictionary接口。

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

相关问题 更多 >