dbm.md
1> **Источник:** https://python-all.ru/3.1/library/dbm.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.5. `dbm` – Интерфейсы к Unix-«базам данных»89`dbm` – это универсальный интерфейс к разновидностям базы данных DBM – `dbm.gnu` или `dbm.ndbm`. Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация в модуле `dbm.dumb`. Существует [сторонний интерфейс](https://python-all.ru/3.1/library/dbm.html) к Oracle Berkeley DB.1011#### `exception dbm.error`1213Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с тем же именем1415[`dbm.error`](https://python-all.ru/3.1/library/dbm.html#dbm.error)1617является первым элементом – последнее используется, когда возбуждается1819[`dbm.error`](https://python-all.ru/3.1/library/dbm.html#dbm.error)2021.2223#### `dbm.whichdb(filename)`2425Эта функция пытается определить, какой из нескольких простых модулей баз данных, доступных – `dbm.gnu`, `dbm.ndbm` или `dbm.dumb` – следует использовать для открытия указанного файла.2627Возвращает одно из следующих значений: `None`, если файл не может быть открыт, так как он нечитаем или не существует; пустую строку (`''`), если формат файла не удаётся определить; или строку, содержащую имя требуемого модуля, например `'dbm.ndbm'` или `'dbm.gnu'`.2829#### `dbm.open(file, flag='r', mode=0o666)`3031Открывает файл базы данных *file* и возвращает соответствующий объект.3233Если файл базы данных уже существует, функция [`whichdb()`](https://python-all.ru/3.1/library/dbm.html#dbm.whichdb) используется для определения его типа, и используется соответствующий модуль; если он не существует, используется первый модуль из перечисленных выше, который можно импортировать.3435Необязательный аргумент *flag* может быть:3637| Значение | Значение |38| --- | --- |39| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |40| `'w'` | Открыть существующую базу данных для чтения и записи |41| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |42| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |4344Необязательный аргумент *mode* – это режим Unix для файла, используется только при создании базы данных. По умолчанию равен восьмеричному `0o666` (и будет изменён в соответствии с текущей umask).4546Объект, возвращаемый [`open()`](https://python-all.ru/3.1/library/dbm.html#dbm.open), поддерживает почти те же возможности, что и словари: можно сохранять, получать и удалять ключи и соответствующие им значения; также доступны оператор [`in`](https://python-all.ru/3.1/reference/expressions.html#in) и метод `keys()`. Ключи и значения всегда хранятся в виде байт. Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.4748Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:4950```python51import dbm5253# Открыть базу данных, создав её при необходимости.54db = dbm.open('cache', 'c')5556# Записать несколько значений.57db[b'hello'] = b'there'58db['www.python.org'] = 'Python Website'59db['www.cnn.com'] = 'Cable News Network'6061# Обратите внимание: теперь ключи считаются байтами.62assert db[b'www.python.org'] == b'Python Website'63# Обратите внимание, что теперь значение хранится в байтах.64assert db['www.cnn.com'] == b'Cable News Network'6566# Часто используемые методы интерфейса dict также работают.67print(db.get('python.org', b'not present'))6869# Сохранение нестрокового ключа или значения вызовет исключение (скорее всего,70# TypeError).71db['www.yahoo.com'] = 47273# Закрыть после завершения.74db.close()75```7677> **См. также**78>79> **Модуль [`shelve`](https://python-all.ru/3.1/library/shelve.html#module-shelve)**80>81> Модуль персистентности, который хранит нестроковые данные.8283Отдельные подмодули описаны в следующих разделах.8485## 11.5.1. `dbm.gnu` – GNU-реинтерпретация dbm8687*Платформы:* Unix8889Этот модуль во многом похож на модуль `dbm`, но использует библиотеку GNU `gdbm`, чтобы предоставить некоторые дополнительные возможности. Обратите внимание, что форматы файлов, создаваемые `dbm.gnu` и `dbm.ndbm`, несовместимы.9091Модуль `dbm.gnu` предоставляет интерфейс к библиотеке GNU DBM. Объекты `dbm.gnu.gdbm` ведут себя как отображения (словари), за исключением того, что ключи и значения всегда преобразуются в байты перед сохранением. При выводе объекта `gdbm` не выводятся ключи и значения, а методы `items()` и `values()` не поддерживаются.9293#### `exception dbm.gnu.error`9495Возбуждается при ошибках, специфичных для9697`dbm.gnu`9899, например, при ошибках ввода-вывода.100101[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)102103возбуждается при общих ошибках отображения, таких как указание неверного ключа.104105#### `dbm.gnu.open(filename[, flag[, mode]])`106107Открывает базу данных `gdbm` и возвращает объект `gdbm`. Аргумент *filename* – это имя файла базы данных.108109Необязательный аргумент *flag* может быть:110111| Значение | Значение |112| --- | --- |113| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |114| `'w'` | Открыть существующую базу данных для чтения и записи |115| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |116| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |117118Следующие дополнительные символы могут быть добавлены к флагу для управления тем, как открывается база данных:119120| Значение | Значение |121| --- | --- |122| `'f'` | Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться. |123| `'s'` | Синхронизированный режим. Это приведёт к тому, что изменения в базу данных будут немедленно записаны в файл. |124| `'u'` | Не блокировать базу данных. |125126Не все флаги допустимы для всех версий `gdbm`. Константа модуля `open_flags` – это строка поддерживаемых символов флагов. Исключение [`error`](https://python-all.ru/3.1/library/dbm.html#dbm.gnu.error) возбуждается, если указан недопустимый флаг.127128Необязательный аргумент *mode* – это режим Unix для файла, используется только при создании базы данных. По умолчанию равен восьмеричному `0o666`.129130Помимо методов, подобных словарным, объекты `gdbm` имеют следующие методы:131132#### `gdbm.firstkey()`133134С помощью этого метода и метода135136[`nextkey()`](https://python-all.ru/3.1/library/dbm.html#dbm.gnu.gdbm.nextkey)137138можно перебрать все ключи базы данных. Порядок обхода определяется внутренними хеш-значениями139140`gdbm`141142и не соответствует порядку ключей. Этот метод возвращает начальный ключ.143144#### `gdbm.nextkey(key)`145146Возвращает ключ, следующий за *key* в порядке обхода. Следующий код выводит все ключи базы данных `db`, не создавая в памяти список, содержащий их все:147148```python149k = db.firstkey()150while k != None:151 print(k)152 k = db.nextkey(k)153```154155#### `gdbm.reorganize()`156157Если было выполнено много удалений и требуется уменьшить пространство, занимаемое файлом158159`gdbm`160161, эта процедура реорганизует базу данных. Объекты162163`gdbm`164165не будут уменьшать размер файла базы данных иначе как с помощью этой реорганизации; в противном случае удалённое пространство файла сохраняется и повторно используется при добавлении новых пар (ключ, значение).166167#### `gdbm.sync()`168169Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.170171## 11.5.2. `dbm.ndbm` – Интерфейс на основе ndbm172173*Платформы:* Unix174175Модуль `dbm.ndbm` предоставляет интерфейс к Unix-библиотеке «(n)dbm». Объекты Dbm ведут себя как отображения (словари), за исключением того, что ключи и значения всегда хранятся в виде байт. При выводе объекта `dbm` не выводятся ключи и значения, а методы `items()` и `values()` не поддерживаются.176177Этот модуль можно использовать с «классическим» интерфейсом ndbm или с интерфейсом совместимости GNU GDBM. В Unix скрипт **configure** попытается найти соответствующий заголовочный файл, чтобы упростить сборку этого модуля.178179#### `exception dbm.ndbm.error`180181Возбуждается при ошибках, специфичных для182183`dbm.ndbm`184185, например, при ошибках ввода-вывода.186187[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)188189возбуждается при общих ошибках отображения, таких как указание неверного ключа.190191#### `dbm.ndbm.library`192193Имя используемой библиотеки реализации194195`ndbm`196197.198199#### `dbm.ndbm.open(filename[, flag[, mode]])`200201Открывает базу данных dbm и возвращает объект `dbm`. Аргумент *filename* – это имя файла базы данных (без расширений `.dir` или `.pag`).202203Необязательный аргумент *flag* должен быть одним из следующих значений:204205| Значение | Значение |206| --- | --- |207| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |208| `'w'` | Открыть существующую базу данных для чтения и записи |209| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |210| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |211212Необязательный аргумент *mode* – это режим Unix для файла, используется только при создании базы данных. По умолчанию равен восьмеричному `0o666` (и будет изменён в соответствии с текущей umask).213214## 11.5.3. `dbm.dumb` – Портативная реализация DBM215216> **Примечание**217>218> Модуль `dbm.dumb` предназначен в качестве последнего запасного варианта для модуля `dbm`, когда более надёжный модуль недоступен. Модуль `dbm.dumb` написан не для скорости и используется не так интенсивно, как другие модули баз данных.219220Модуль `dbm.dumb` предоставляет постоянный интерфейс, похожий на словарь, который полностью написан на Python. В отличие от других модулей, таких как `dbm.gnu`, не требуется внешняя библиотека. Как и в других постоянных отображениях, ключи и значения всегда хранятся как байты.221222Модуль определяет следующее:223224#### `exception dbm.dumb.error`225226Возникает при ошибках, специфичных для227228`dbm.dumb`229230, таких как ошибки ввода-вывода.231232[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)233234возникает для общих ошибок отображения, таких как указание неверного ключа.235236#### `dbm.dumb.open(filename[, flag[, mode]])`237238Открывает базу данных `dumbdbm` и возвращает объект dumbdbm. Аргумент *filename* – это базовое имя файла базы данных (без каких-либо конкретных расширений). При создании базы данных dumbdbm создаются файлы с расширениями `.dat` и `.dir`.239240Необязательный аргумент *flag* в настоящее время игнорируется; база данных всегда открывается для обновления и будет создана, если она не существует.241242Необязательный аргумент *mode* – это Unix-режим файла, используемый только при создании базы данных. По умолчанию он равен восьмеричному `0o666` (и будет изменён действующей маской umask).243244В дополнение к методам, предоставляемым классом [`collections.MutableMapping`](https://python-all.ru/3.1/library/collections.html#collections.MutableMapping), объекты `dumbdbm` предоставляют следующий метод:245246#### `dumbdbm.sync()`247248Синхронизирует каталог и файлы данных на диске. Этот метод вызывается методом249250`Shelve.sync()`251252.253