dbm.md
1> **Источник:** https://python-all.ru/3.4/library/dbm.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 12.5. [`dbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm) – Интерфейсы к «базам данных» Unix89[`dbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm) – это универсальный интерфейс к разновидностям БД DBM – [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu) или [`dbm.ndbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm.ndbm). Если ни один из этих модулей не установлен, будет использована медленная, но простая реализация в модуле [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb). Существует [сторонний интерфейс](https://python-all.ru/3.4/library/dbm.html) к Oracle Berkeley DB.1011#### `exception dbm.error`1213Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с тем же именем [`dbm.error`](https://python-all.ru/3.4/library/dbm.html#dbm.error) является первым элементом – последнее используется, когда возбуждается [`dbm.error`](https://python-all.ru/3.4/library/dbm.html#dbm.error).1415#### `dbm.whichdb(filename)`1617Эта функция пытается угадать, какой из нескольких простых модулей баз данных – [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu), [`dbm.ndbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm.ndbm) или [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb) – следует использовать для открытия указанного файла.1819Возвращает одно из следующих значений: `None`, если файл не может быть открыт, так как он нечитаем или не существует; пустую строку (`''`), если формат файла не удаётся определить; или строку, содержащую имя требуемого модуля, например `'dbm.ndbm'` или `'dbm.gnu'`.2021#### `dbm.open(file, flag='r', mode=0o666)`2223Открывает файл базы данных *file* и возвращает соответствующий объект.2425Если файл базы данных уже существует, функция [`whichdb()`](https://python-all.ru/3.4/library/dbm.html#dbm.whichdb) используется для определения его типа, и используется соответствующий модуль; если он не существует, используется первый модуль из перечисленных выше, который можно импортировать.2627Необязательный аргумент *flag* может быть:2829| Значение | Значение |30| --- | --- |31| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |32| `'w'` | Открыть существующую базу данных для чтения и записи |33| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |34| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |3536Необязательный аргумент *mode* – это режим Unix для файла, используется только при создании базы данных. По умолчанию он имеет восьмеричное значение `0o666` (и будет изменён в соответствии с текущей umask).3738Объект, возвращаемый [`open()`](https://python-all.ru/3.4/library/dbm.html#dbm.open), поддерживает те же основные функции, что и словари; ключи и соответствующие им значения можно сохранять, извлекать и удалять, а также доступны оператор [`in`](https://python-all.ru/3.4/reference/expressions.html#in) и метод `keys()`, а также `get()` и `setdefault()`.3940Изменено в версии 3.2: `get()` и `setdefault()` теперь доступны во всех модулях баз данных.4142Ключи и значения всегда хранятся в виде байтов. Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.4344Эти объекты также поддерживают использование в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), который автоматически закроет их после завершения.4546Изменено в версии 3.4: Добавлена встроенная поддержка протокола управления контекстом для объектов, возвращаемых [`open()`](https://python-all.ru/3.4/library/dbm.html#dbm.open).4748Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:4950```python51import dbm5253# Открыть базу данных, создав её при необходимости.54with dbm.open('cache', 'c') as db:5556 # Записать несколько значений.57 db[b'hello'] = b'there'58 db['www.python.org'] = 'Python Website'59 db['www.cnn.com'] = 'Cable News Network'6061 # Обратите внимание: теперь ключи считаются байтами.62 assert db[b'www.python.org'] == b'Python Website'63 # Обратите внимание, что теперь значение хранится в байтах.64 assert db['www.cnn.com'] == b'Cable News Network'6566 # Часто используемые методы интерфейса dict также работают.67 print(db.get('python.org', b'not present'))6869 # Сохранение нестрокового ключа или значения вызовет исключение (скорее всего,70 # TypeError).71 db['www.yahoo.com'] = 47273# db автоматически закрывается при выходе из оператора with.74```7576> **См. также**77>78> **Модуль [`shelve`](https://python-all.ru/3.4/library/shelve.html#module-shelve)**79>80> Модуль персистентности, который хранит нестроковые данные.8182Отдельные подмодули описаны в следующих разделах.8384## 12.5.1. [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu) – интерпретация dbm от GNU8586Этот модуль очень похож на модуль [`dbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm), но использует библиотеку GNU `gdbm` для предоставления дополнительных возможностей. Обратите внимание, что форматы файлов, создаваемые [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu) и [`dbm.ndbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm.ndbm), несовместимы.8788Модуль [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu) предоставляет интерфейс к библиотеке GNU DBM. Объекты `dbm.gnu.gdbm` ведут себя как отображения (словари), за исключением того, что ключи и значения всегда преобразуются в байты перед сохранением. Вывод объекта `gdbm` не отображает ключи и значения, а методы `items()` и `values()` не поддерживаются.8990#### `exception dbm.gnu.error`9192Возбуждается при ошибках, специфичных для [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu), таких как ошибки ввода-вывода. [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError) возбуждается для общих ошибок отображения, например при указании неверного ключа.9394#### `dbm.gnu.open(filename[, flag[, mode]])`9596Открывает базу данных `gdbm` и возвращает объект `gdbm`. Аргумент *filename* – это имя файла базы данных.9798Необязательный аргумент *flag* может быть:99100| Значение | Значение |101| --- | --- |102| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |103| `'w'` | Открыть существующую базу данных для чтения и записи |104| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |105| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |106107Следующие дополнительные символы могут быть добавлены к флагу для управления тем, как открывается база данных:108109| Значение | Значение |110| --- | --- |111| `'f'` | Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться. |112| `'s'` | Синхронизированный режим. Это приведёт к тому, что изменения в базу данных будут немедленно записаны в файл. |113| `'u'` | Не блокировать базу данных. |114115Не все флаги допустимы для всех версий `gdbm`. Константа модуля `open_flags` – это строка поддерживаемых символов флагов. Исключение [`error`](https://python-all.ru/3.4/library/dbm.html#dbm.gnu.error) возбуждается, если указан недопустимый флаг.116117Необязательный аргумент *mode* – это режим Unix для файла, используется только при создании базы данных. По умолчанию равен восьмеричному `0o666`.118119Помимо методов, подобных словарным, объекты `gdbm` имеют следующие методы:120121#### `gdbm.firstkey()`122123С помощью этого метода и метода [`nextkey()`](https://python-all.ru/3.4/library/dbm.html#dbm.gnu.gdbm.nextkey) можно перебрать все ключи базы данных. Порядок обхода определяется внутренними хеш-значениями `gdbm` и не соответствует порядку ключей. Этот метод возвращает начальный ключ.124125#### `gdbm.nextkey(key)`126127Возвращает ключ, следующий за *key* в порядке обхода. Следующий код выводит все ключи базы данных `db`, не создавая в памяти список, содержащий их все:128129```python130k = db.firstkey()131while k != None:132 print(k)133 k = db.nextkey(k)134```135136#### `gdbm.reorganize()`137138Если было выполнено много удалений и требуется уменьшить пространство, занимаемое файлом `gdbm`, эта процедура реорганизует базу данных. Объекты `gdbm` не будут уменьшать размер файла базы данных иначе как с помощью этой реорганизации; в противном случае удалённое пространство файла сохраняется и повторно используется при добавлении новых пар (ключ, значение).139140#### `gdbm.sync()`141142Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.143144#### `gdbm.close()`145146Закрывает базу данных `gdbm`.147148## 12.5.2. [`dbm.ndbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm.ndbm) – Интерфейс на основе ndbm149150Модуль [`dbm.ndbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm.ndbm) предоставляет интерфейс к библиотеке Unix “(n)dbm”. Объекты Dbm ведут себя как отображения (словари), за исключением того, что ключи и значения всегда хранятся в виде байтов. При печати объекта `dbm` ключи и значения не выводятся, а методы `items()` и `values()` не поддерживаются.151152Этот модуль можно использовать с «классическим» интерфейсом ndbm или с интерфейсом совместимости GNU GDBM. В Unix скрипт **configure** попытается найти соответствующий заголовочный файл, чтобы упростить сборку этого модуля.153154#### `exception dbm.ndbm.error`155156Возбуждается при ошибках, специфичных для [`dbm.ndbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm.ndbm), например, ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError) возбуждается при общих ошибках отображения, таких как указание неверного ключа.157158#### `dbm.ndbm.library`159160Имя используемой библиотеки реализации `ndbm`.161162#### `dbm.ndbm.open(filename[, flag[, mode]])`163164Открывает базу данных dbm и возвращает объект `ndbm`. Аргумент *filename* – это имя файла базы данных (без расширений `.dir` или `.pag`).165166Необязательный аргумент *flag* должен быть одним из следующих значений:167168| Значение | Значение |169| --- | --- |170| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |171| `'w'` | Открыть существующую базу данных для чтения и записи |172| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |173| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |174175Необязательный аргумент *mode* – это режим Unix для файла, используется только при создании базы данных. По умолчанию равен восьмеричному `0o666` (и будет изменён в соответствии с текущей umask).176177Помимо методов, подобных словарным, объекты `ndbm` предоставляют следующий метод:178179#### `ndbm.close()`180181Закрывает базу данных `ndbm`.182183## 12.5.3. [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb) – Переносимая реализация DBM184185> **Примечание**186>187> Модуль [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb) предназначен в качестве запасного варианта для модуля [`dbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm), когда более надёжный модуль недоступен. Модуль [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb) не оптимизирован для скорости и используется не так активно, как другие модули баз данных.188189Модуль [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb) предоставляет интерфейс, похожий на словарь с постоянным хранением, который полностью написан на Python. В отличие от других модулей, таких как [`dbm.gnu`](https://python-all.ru/3.4/library/dbm.html#module-dbm.gnu), внешние библиотеки не требуются. Как и в других постоянных отображениях, ключи и значения всегда хранятся в виде байтов.190191Модуль определяет следующее:192193#### `exception dbm.dumb.error`194195Возбуждается при ошибках, специфичных для [`dbm.dumb`](https://python-all.ru/3.4/library/dbm.html#module-dbm.dumb), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError) возбуждается для общих ошибок отображения, таких как указание неверного ключа.196197#### `dbm.dumb.open(filename[, flag[, mode]])`198199Открывает базу данных `dumbdbm` и возвращает объект dumbdbm. Аргумент *filename* – это базовое имя файла базы данных (без каких-либо конкретных расширений). При создании базы данных dumbdbm создаются файлы с расширениями `.dat` и `.dir`.200201Необязательный аргумент *flag* в настоящее время игнорируется; база данных всегда открывается для обновления и будет создана, если она не существует.202203Необязательный аргумент *mode* – это Unix-режим файла, используемый только при создании базы данных. По умолчанию он равен восьмеричному `0o666` (и будет изменён действующей маской umask).204205В дополнение к методам, предоставляемым классом [`collections.abc.MutableMapping`](https://python-all.ru/3.4/library/collections.abc.html#collections.abc.MutableMapping), объекты `dumbdbm` предоставляют следующие методы:206207#### `dumbdbm.sync()`208209Синхронизирует каталог и файлы данных на диске. Этот метод вызывается методом `Shelve.sync()`.210211#### `dumbdbm.close()`212213Закрывает базу данных `dumbdbm`.214