Использование модуля dbm в Python 3 - PullRequest
3 голосов
/ 01 июня 2011

Я изучаю файлы базы данных и модуль dbm в Python 3.1.3, и у меня возникают проблемы с использованием некоторых методов из модуля anydbm в Python 2.

Метод 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' не повторяется.

Эти методы просто не работают в модуле dbmв питоне 3?Если это правда, могу ли я использовать что-нибудь еще?

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Я думаю, это зависит от того, какую реализацию он выберет для использования.В моей системе dbm в Python 3 выбирает использовать ndbm, что эквивалентно модулю dbm в Python 2. Когда я использую этот модуль явно, я вижу те же ограничения.

В Python появляется anydbm2 выбирает dumbdbm, который медленнее, но поддерживает полный словарный интерфейс.

Возможно, вы захотите взглянуть на модуль shelve, как на Python 2, так и на 3, который добавляет еще один слой поверх этих интерфейсовВы должны хранить любой маринованный объект).

1 голос
/ 02 июня 2011

Цель таких простых баз данных - действовать в качестве хранилищ ключей / значений. Если вам нужны все значения, вы должны перебирать все ключи. То есть:

values = [db[key] for key in db.keys()]

Это не будет быстрым. Возможно, мне не хватает такого рода хранилища ключей / значений. Возможно, SQLite будет лучше?

Тем не менее, вы можете получить доступ к dumbdbm под именем dbm.dumb в Python 3.

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