Модуль dbm
- это универсальный интерфейс для вариантов базы данных DBM - dbm.gnu
или dbm.ndbm
. Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация в модуле dbm.dumb
.
База данных DBM это платформенно-независимый механизм для хранения строк в файле как в хеше. И ключ, и ассоциированные с ним данные должны быть строками. DBM можно считать простейшим движком баз данных.
Ключ и значения всегда хранятся в байтах. Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.
dbm.open(file, flag='r', mode=0o666)
:Функция dbm.open()
открывает файл file
базы данных и возвращает соответствующий объект, похожий на словарь.
Возвращаемый объект, поддерживает те же основные функции, что и словари. Ключи и соответствующие им значения могут быть сохранены, извлечены и удалены, доступны оператор in
и методы dict.keys()
, а также dict.get()
и dict.setdefault()
.
Если файл базы данных уже существует, то используется функция dbm.whichdb()
для определения его типа и подключения соответствующего модуля. Если файл не найден, то для его создания используется первый из перечисленных выше модулей, который можно импортировать.
Необязательный аргумент flag
может быть:
Значение | Смысл |
'r' | Открыть существующую базу данных только для чтения (по умолчанию) |
'w' | Откройте существующую базу данных для чтения и записи |
'c' | Откройте базу данных для чтения и записи, создавая ее, если ее не существует |
'n' | Всегда создает новую пустую базу данных, открытую для чтения и записи |
Удаление ключа из базы данных, доступной только для чтения, вызывает специфичную для модуля базы данных ошибку, вместо KeyError
.
Необязательный аргумент mode
- это режим Unix файла, используемый только тогда, когда необходимо создать базу данных. По умолчанию это 0o666
и будет изменено преобладающим umask
.
Функция dbm.open()
также поддерживают использование в операторе with
, который автоматически закроет базу данных по завершении.
dbm.whichdb(filename)
:Функция dbm.open()
пытается определить, какой из нескольких доступных модулей базы данных - dbm.gnu
, dbm.ndbm
или dbm.dumb
- следует использовать для открытия данного файла.
Возвращает одно из следующих значений:
None
, если файл не может быть открыт из-за того, что он не читается или не существует; ''
, если формат файла не может быть определен; dbm.ndbm
или dbm.gnu
.dbm.error
:Исключение dbm.error
- кортеж, содержащий исключения, которые могут быть вызваны каждым из поддерживаемых модулей, с уникальным исключением, также называемым dbm.error
в качестве первого элемента.
>>> import dbm >>> dbm.error # (<class 'dbm.error'>, <class 'OSError'>)
import dbm # Откроем базу данных, создав ее при необходимости. with dbm.open('cache', 'c') as db: # Запишем некоторые значения db['www.python.org'] = 'Python Website' db['docs-python.ru'] = 'Python information Hub' # Обратите внимание, что ключи можно указывать # как байтовые строки. assert db[b'www.python.org'] == b'Python Website' # Обратите внимание, что тип значения ключа теперь в байтах. assert db['docs-python.ru'] == b'Python information Hub' # Часто используемый метод интерфейса 'dict'. print(db.get('python.org', b'not present')) # Хранение нестрокового ключа или значения # вызовет исключение TypeError. db['www.yahoo.com'] = 4 # БД автоматически закрывается при выходе из оператора 'with'. # Добавим значение в базу 'cache' with dbm.open('cache', 'c') as db: db['hello'] = 'World' # прочитаем базу 'cache' with dbm.open('cache', 'c') as db: a = db['www.python.org'] b = db['docs-python.ru'] c = db['hello'] >>> print(a, b, c) # b'Python Website' b'Python information Hub' b'World' >>> dbm.whichdb('cache') # 'dbm.gnu'