Документация Python неофициальный перевод

dbm.md

247 строк · 21.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.8/library/dbm.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`dbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm) – Интерфейсы к Unix-«базам данных»89**Исходный код:** [Lib/dbm/\_\_init\_\_.py](https://python-all.ru/src/3.8/Lib/dbm/__init__.py)1011---1213[`dbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm) – это универсальный интерфейс к разновидностям базы данных DBM: [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu) или [`dbm.ndbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm.ndbm). Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация из модуля [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb). Существует также [сторонний интерфейс](https://python-all.ru/3.8/library/dbm.html) к Oracle Berkeley DB.1415#### `exception dbm.error`1617Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с именем [`dbm.error`](https://python-all.ru/3.8/library/dbm.html#dbm.error) является первым элементом – последнее используется, когда возбуждается [`dbm.error`](https://python-all.ru/3.8/library/dbm.html#dbm.error).1819#### `dbm.whichdb(filename)`2021Эта функция пытается угадать, какой из нескольких доступных простых модулей баз данных – [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu), [`dbm.ndbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm.ndbm) или [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb) – следует использовать для открытия указанного файла.2223Возвращает одно из следующих значений: `None`, если файл невозможно открыть, так как он нечитаем или не существует; пустую строку (`''`), если формат файла не удаётся определить; или строку, содержащую имя требуемого модуля, например `'dbm.ndbm'` или `'dbm.gnu'`.2425#### `dbm.open(file, flag='r', mode=0o666)`2627Открывает файл базы данных *file* и возвращает соответствующий объект.2829Если файл базы данных уже существует, функция [`whichdb()`](https://python-all.ru/3.8/library/dbm.html#dbm.whichdb) используется для определения его типа и используется соответствующий модуль; если он не существует, используется первый модуль из перечисленных выше, который можно импортировать.3031Необязательный аргумент *flag* может быть:3233| Значение | Значение |34| --- | --- |35| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |36| `'w'` | Открыть существующую базу данных для чтения и записи |37| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |38| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |3940Необязательный аргумент *mode* – это режим файла Unix, используемый только при создании базы данных. По умолчанию это восьмеричное `0o666` (и будет изменено текущей umask).4142Объект, возвращаемый [`open()`](https://python-all.ru/3.8/library/dbm.html#dbm.open), поддерживает ту же базовую функциональность, что и словари; ключи и соответствующие им значения могут быть сохранены, получены и удалены, а также доступны оператор [`in`](https://python-all.ru/3.8/reference/expressions.html#in) и метод `keys()`, а также `get()` и `setdefault()`.4344Изменено в версии 3.2: `get()` и `setdefault()` теперь доступны во всех модулях баз данных.4546Изменено в версии 3.8: Удаление ключа из базы данных, открытой только для чтения, вызывает ошибку, специфичную для модуля базы данных, вместо [`KeyError`](https://python-all.ru/3.8/library/exceptions.html#KeyError).4748Ключи и значения всегда хранятся в виде байтов. Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.4950Эти объекты также поддерживают использование в операторе [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with), который автоматически закроет их по завершении.5152Изменено в версии 3.4: Добавлена встроенная поддержка протокола управления контекстом для объектов, возвращаемых [`open()`](https://python-all.ru/3.8/library/dbm.html#dbm.open).5354Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:5556```python57import dbm5859# Открыть базу данных, создав её при необходимости.60with dbm.open('cache', 'c') as db:6162    # Записать несколько значений.63    db[b'hello'] = b'there'64    db['www.python.org'] = 'Python Website'65    db['www.cnn.com'] = 'Cable News Network'6667    # Обратите внимание: теперь ключи считаются байтами.68    assert db[b'www.python.org'] == b'Python Website'69    # Обратите внимание, что теперь значение хранится в байтах.70    assert db['www.cnn.com'] == b'Cable News Network'7172    # Часто используемые методы интерфейса dict также работают.73    print(db.get('python.org', b'not present'))7475    # Сохранение нестрокового ключа или значения вызовет исключение (скорее всего,76    # TypeError).77    db['www.yahoo.com'] = 47879# db автоматически закрывается при выходе из оператора with.80```8182> **См. также**83>84> **Модуль [`shelve`](https://python-all.ru/3.8/library/shelve.html#module-shelve)**85>86> Модуль персистентности, который хранит нестроковые данные.8788Отдельные подмодули описаны в следующих разделах.8990## [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu) – переосмысление GNU библиотеки dbm9192**Исходный код:** [Lib/dbm/gnu.py](https://python-all.ru/src/3.8/Lib/dbm/gnu.py)9394---9596Этот модуль очень похож на модуль [`dbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm), но использует библиотеку GNU `gdbm` для предоставления некоторых дополнительных возможностей. Обратите внимание, что форматы файлов, созданные [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu) и [`dbm.ndbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm.ndbm), несовместимы.9798Модуль [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu) предоставляет интерфейс к библиотеке GNU DBM. Объекты `dbm.gnu.gdbm` ведут себя как отображения (словари), за исключением того, что ключи и значения всегда преобразуются в байты перед сохранением. При печати объекта `gdbm` ключи и значения не выводятся, а методы `items()` и `values()` не поддерживаются.99100#### `exception dbm.gnu.error`101102Возбуждается при ошибках, специфичных для [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu), таких как ошибки ввода-вывода. [`KeyError`](https://python-all.ru/3.8/library/exceptions.html#KeyError) возбуждается для общих ошибок отображения, например, при указании неверного ключа.103104#### `dbm.gnu.open(filename[, flag[, mode]])`105106Открывает базу данных `gdbm` и возвращает объект `gdbm`. Аргумент *filename* – это имя файла базы данных.107108Необязательный аргумент *flag* может быть:109110| Значение | Значение |111| --- | --- |112| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |113| `'w'` | Открыть существующую базу данных для чтения и записи |114| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |115| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |116117Следующие дополнительные символы могут быть добавлены к флагу для управления тем, как открывается база данных:118119| Значение | Значение |120| --- | --- |121| `'f'` | Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться. |122| `'s'` | Синхронизированный режим. Это приведёт к тому, что изменения в базу данных будут немедленно записаны в файл. |123| `'u'` | Не блокировать базу данных. |124125Не все флаги допустимы для всех версий `gdbm`. Константа модуля `open_flags` – это строка поддерживаемых символов флагов. Исключение [`error`](https://python-all.ru/3.8/library/dbm.html#dbm.gnu.error) возникает, если указан недопустимый флаг.126127Необязательный аргумент *mode* – это Unix-режим файла, используемый только при создании базы данных. По умолчанию он равен восьмеричному `0o666`.128129В дополнение к методам, похожим на словарные, объекты `gdbm` имеют следующие методы:130131#### `gdbm.firstkey()`132133Можно перебрать все ключи в базе данных с помощью этого метода и метода [`nextkey()`](https://python-all.ru/3.8/library/dbm.html#dbm.gnu.gdbm.nextkey). Порядок обхода определяется внутренними хеш-значениями `gdbm`, а не сортировкой по ключам. Этот метод возвращает начальный ключ.134135#### `gdbm.nextkey(key)`136137Возвращает ключ, следующий за *key* при обходе. Следующий код выводит все ключи базы данных `db`, не создавая в памяти список, содержащий их все:138139```python140k = db.firstkey()141while k != None:142    print(k)143    k = db.nextkey(k)144```145146#### `gdbm.reorganize()`147148Если было выполнено много удалений и требуется уменьшить пространство, занимаемое файлом `gdbm`, эта процедура проведёт реорганизацию базы данных. Объекты `gdbm` не сокращают длину файла базы данных, кроме как с помощью этой реорганизации; в противном случае освободившееся пространство сохраняется и повторно используется при добавлении новых пар (ключ, значение).149150#### `gdbm.sync()`151152Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.153154#### `gdbm.close()`155156Закрыть базу данных `gdbm`.157158## [`dbm.ndbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm.ndbm) – интерфейс на основе ndbm159160**Исходный код:** [Lib/dbm/ndbm.py](https://python-all.ru/src/3.8/Lib/dbm/ndbm.py)161162---163164Модуль [`dbm.ndbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm.ndbm) предоставляет интерфейс к библиотеке Unix «(n)dbm». Объекты dbm ведут себя как отображения (словари), за исключением того, что ключи и значения всегда хранятся в виде байтов. Вывод объекта `dbm` не отображает ключи и значения, а методы `items()` и `values()` не поддерживаются.165166Этот модуль можно использовать с «классическим» интерфейсом ndbm или с интерфейсом совместимости GNU GDBM. В Unix скрипт **configure** попытается найти соответствующий заголовочный файл, чтобы упростить сборку этого модуля.167168#### `exception dbm.ndbm.error`169170Возникает при ошибках, специфичных для [`dbm.ndbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm.ndbm), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.8/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.171172#### `dbm.ndbm.library`173174Имя используемой библиотеки реализации `ndbm`.175176#### `dbm.ndbm.open(filename[, flag[, mode]])`177178Открывает базу данных dbm и возвращает объект `ndbm`. Аргумент *filename* – это имя файла базы данных (без расширений `.dir` или `.pag`).179180Необязательный аргумент *flag* должен быть одним из следующих значений:181182| Значение | Значение |183| --- | --- |184| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |185| `'w'` | Открыть существующую базу данных для чтения и записи |186| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |187| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |188189Необязательный аргумент *mode* – это режим файла Unix, используемый только при создании базы данных. По умолчанию это восьмеричное `0o666` (и будет изменено текущей umask).190191В дополнение к методам, похожим на словарные, объекты `ndbm` предоставляют следующий метод:192193#### `ndbm.close()`194195Закрыть базу данных `ndbm`.196197## [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb) – переносимая реализация DBM198199**Исходный код:** [Lib/dbm/dumb.py](https://python-all.ru/src/3.8/Lib/dbm/dumb.py)200201> **Примечание**202>203> Модуль [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb) предназначен в качестве запасного варианта для модуля [`dbm`](https://python-all.ru/3.8/library/dbm.html#module-dbm), когда более надёжный модуль недоступен. Модуль [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb) не оптимизирован для скорости и используется не так интенсивно, как другие модули баз данных.204205---206207Модуль [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb) предоставляет постоянный интерфейс, похожий на словарь, который полностью написан на Python. В отличие от других модулей, таких как [`dbm.gnu`](https://python-all.ru/3.8/library/dbm.html#module-dbm.gnu), не требуется внешняя библиотека. Как и в других постоянных отображениях, ключи и значения всегда хранятся в виде байтов.208209Модуль определяет следующее:210211#### `exception dbm.dumb.error`212213Возникает при ошибках, специфичных для [`dbm.dumb`](https://python-all.ru/3.8/library/dbm.html#module-dbm.dumb), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.8/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.214215#### `dbm.dumb.open(filename[, flag[, mode]])`216217Открывает базу данных `dumbdbm` и возвращает объект dumbdbm. Аргумент *filename* – это базовое имя файла базы данных (без каких-либо конкретных расширений). При создании базы данных dumbdbm создаются файлы с расширениями `.dat` и `.dir`.218219Необязательный аргумент *flag* может быть:220221| Значение | Значение |222| --- | --- |223| `'r'` | Открыть существующую базу данных только для чтения (по умолчанию) |224| `'w'` | Открыть существующую базу данных для чтения и записи |225| `'c'` | Открыть базу данных для чтения и записи, создав её, если она не существует |226| `'n'` | Всегда создавать новую пустую базу данных, открытую для чтения и записи |227228Необязательный аргумент *mode* – это режим файла Unix, используемый только при создании базы данных. По умолчанию это восьмеричное `0o666` (и будет изменено текущей umask).229230> **Предупреждение**231>232> Интерпретатор Python может аварийно завершиться при загрузке базы данных со достаточно большой/сложной записью из-за ограничений глубины стека в компиляторе AST Python.233234Изменено в версии 3.5: [`open()`](https://python-all.ru/3.8/library/dbm.html#dbm.dumb.open) всегда создаёт новую базу данных, если флаг имеет значение `'n'`.235236Изменено в версии 3.8: База данных, открытая с флагами `'r'`, теперь доступна только для чтения. Открытие с флагами `'r'` и `'w'` больше не создаёт базу данных, если она не существует.237238В дополнение к методам, предоставляемым классом [`collections.abc.MutableMapping`](https://python-all.ru/3.8/library/collections.abc.html#collections.abc.MutableMapping), объекты `dumbdbm` предоставляют следующие методы:239240#### `dumbdbm.sync()`241242Синхронизировать каталог на диске и файлы данных. Этот метод вызывается методом `Shelve.sync()`.243244#### `dumbdbm.close()`245246Закрыть базу данных `dumbdbm`.247