【问题标题】:Using the dbm module in Python 3在 Python 3 中使用 dbm 模块
【发布时间】:2011-06-01 16:13:00
【问题描述】:

我正在学习 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:'_dbm.dbm' 对象不可迭代。

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

【问题讨论】:

    标签: python database python-3.x dbm


    【解决方案1】:

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

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

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

    【讨论】:

    • Shelve 非常适合遍历 db,但使用项目和值方法提出 - UnpicklingError: unpickling stack underflow。有什么方法可以使用 Python 3 访问dumbdbm?
    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 2015-07-21
      • 2018-01-07
      相关资源
      最近更新 更多