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

dbm.md

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

1> **Источник:** https://python-all.ru/3.11/library/dbm.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`dbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm) – Интерфейсы к Unix-«базам данных»89**Исходный код:** [Lib/dbm/\_\_init\_\_.py](https://python-all.ru/src/3.11/Lib/dbm/__init__.py)1011---1213[`dbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm) – это универсальный интерфейс к разновидностям базы данных DBM: [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu) или [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm). Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация из модуля [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb). Существует также [сторонний интерфейс](https://python-all.ru/3.11/library/dbm.html) к Oracle Berkeley DB.1415#### `exception dbm.error`1617Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с именем [`dbm.error`](https://python-all.ru/3.11/library/dbm.html#dbm.error) является первым элементом – последнее используется, когда возбуждается [`dbm.error`](https://python-all.ru/3.11/library/dbm.html#dbm.error).1819#### `dbm.whichdb(filename)`2021Эта функция пытается угадать, какой из нескольких доступных простых модулей баз данных – [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu), [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm) или [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb) – следует использовать для открытия указанного файла.2223Возвращает одно из следующих значений:2425- `None`, если файл не может быть открыт, так как он нечитаем или не существует26- пустая строка (`''`), если формат файла не удаётся определить27- строка, содержащая имя требуемого модуля, например `'dbm.ndbm'` или `'dbm.gnu'`2829Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.11/glossary.html#term-path-like-object).3031#### `dbm.open(file, flag='r', mode=0o666)`3233Открывает базу данных и возвращает соответствующий объект базы данных.3435**Параметры:**3637- **file** ([объект, подобный пути](https://python-all.ru/3.11/glossary.html#term-path-like-object)) –3839  Файл базы данных для открытия.4041  Если файл базы данных уже существует, для определения его типа используется функция [`whichdb()`](https://python-all.ru/3.11/library/dbm.html#dbm.whichdb), и применяется соответствующий модуль; если файл не существует, используется первый подмодуль из перечисленных выше, который можно импортировать.42- **flag** ([*str*](https://python-all.ru/3.11/library/stdtypes.html#str)) –4344  - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.45  - `'w'`: Открыть существующую базу данных для чтения и записи.46  - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.47  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.48- **mode** ([*int*](https://python-all.ru/3.11/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.4950Изменено в версии 3.11: *file* теперь принимает [объект, подобный пути](https://python-all.ru/3.11/glossary.html#term-path-like-object).5152Объект, возвращаемый [`open()`](https://python-all.ru/3.11/library/dbm.html#dbm.open), поддерживает ту же базовую функциональность, что и [`dict`](https://python-all.ru/3.11/library/stdtypes.html#dict); ключи и соответствующие им значения могут быть сохранены, получены и удалены, а оператор [`in`](https://python-all.ru/3.11/reference/expressions.html#in) и метод `keys()` доступны, как и методы `get()` и `setdefault()`.5354Ключи и значения всегда хранятся как [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes). Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.5556Эти объекты также поддерживают использование в операторе [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with), который автоматически закроет их по завершении.5758Изменено в версии 3.2: `get()` и `setdefault()` методы теперь доступны для всех бэкендов [`dbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm).5960Изменено в версии 3.4: Добавлена встроенная поддержка протокола управления контекстом для объектов, возвращаемых [`open()`](https://python-all.ru/3.11/library/dbm.html#dbm.open).6162Изменено в версии 3.8: Удаление ключа из базы данных только для чтения теперь возбуждает исключение, специфичное для модуля базы данных, вместо [`KeyError`](https://python-all.ru/3.11/library/exceptions.html#KeyError).6364Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:6566```python67import dbm6869# Открыть базу данных, создав её при необходимости.70with dbm.open('cache', 'c') as db:7172    # Записать несколько значений.73    db[b'hello'] = b'there'74    db['www.python.org'] = 'Python Website'75    db['www.cnn.com'] = 'Cable News Network'7677    # Обратите внимание: теперь ключи считаются байтами.78    assert db[b'www.python.org'] == b'Python Website'79    # Обратите внимание, что теперь значение хранится в байтах.80    assert db['www.cnn.com'] == b'Cable News Network'8182    # Часто используемые методы интерфейса dict также работают.83    print(db.get('python.org', b'not present'))8485    # Сохранение нестрокового ключа или значения вызовет исключение (скорее всего,86    # TypeError).87    db['www.yahoo.com'] = 48889# db автоматически закрывается при выходе из оператора with.90```9192> **См. также**93>94> **Модуль [`shelve`](https://python-all.ru/3.11/library/shelve.html#module-shelve)**95>96> Модуль персистентности, который хранит нестроковые данные.9798Отдельные подмодули описаны в следующих разделах.99100## [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu) – менеджер баз данных GNU101102**Исходный код:** [Lib/dbm/gnu.py](https://python-all.ru/src/3.11/Lib/dbm/gnu.py)103104---105106Модуль [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu) предоставляет интерфейс к библиотеке GDBM, аналогичный модулю [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm), но с дополнительными возможностями, такими как устойчивость к сбоям.107108> **Примечание**109>110> Форматы файлов, созданные с помощью [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu) и [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm), несовместимы и не могут использоваться взаимозаменяемо.111112#### `exception dbm.gnu.error`113114Возбуждается при ошибках, специфичных для [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu), таких как ошибки ввода-вывода. [`KeyError`](https://python-all.ru/3.11/library/exceptions.html#KeyError) возбуждается для общих ошибок отображения, например, при указании неверного ключа.115116#### `dbm.gnu.open(filename, flag='r', mode=0o666, /)`117118Открывает базу данных GDBM и возвращает объект `gdbm`.119120**Параметры:**121122- **filename** ([объект, подобный пути](https://python-all.ru/3.11/glossary.html#term-path-like-object)) – Файл базы данных для открытия.123- **flag** ([*str*](https://python-all.ru/3.11/library/stdtypes.html#str)) –124125  - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.126  - `'w'`: Открыть существующую базу данных для чтения и записи.127  - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.128  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.129130  К строке флага могут быть добавлены следующие дополнительные символы для управления способом открытия базы данных:131132  - `'f'`: Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться.133  - `'s'`: Синхронизированный режим. Изменения в базе данных будут немедленно записаны в файл.134  - `'u'`: Не блокировать базу данных.135136  Не все флаги допустимы для всех версий GDBM. Список поддерживаемых символов флагов см. в члене [`open_flags`](https://python-all.ru/3.11/library/dbm.html#dbm.gnu.open_flags).137- **mode** ([*int*](https://python-all.ru/3.11/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.138139**Возбуждает:**140141[**error**](https://python-all.ru/3.11/library/dbm.html#dbm.gnu.error) – Если передан недопустимый аргумент *flag*.142143Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.11/glossary.html#term-path-like-object).144145#### `dbm.gnu.open_flags`146147Строка символов, которую поддерживает параметр *flag* функции [`open()`](https://python-all.ru/3.11/library/dbm.html#dbm.gnu.open).148149Объекты `gdbm` ведут себя подобно [отображениям](https://python-all.ru/3.11/glossary.html#term-mapping), но методы `items()` и `values()` не поддерживаются. Также предоставлены следующие методы:150151#### `gdbm.firstkey()`152153С помощью этого метода и метода [`nextkey()`](https://python-all.ru/3.11/library/dbm.html#dbm.gnu.gdbm.nextkey) можно выполнять цикл по всем ключам базы данных. Обход упорядочен по внутренним хеш-значениям GDBM, а не по значениям ключей. Этот метод возвращает начальный ключ.154155#### `gdbm.nextkey(key)`156157Возвращает ключ, следующий за *key* при обходе. Следующий код выводит все ключи базы данных `db`, не создавая в памяти список, содержащий их все:158159```python160k = db.firstkey()161while k is not None:162    print(k)163    k = db.nextkey(k)164```165166#### `gdbm.reorganize()`167168Если вы выполнили много удалений и хотите уменьшить пространство, занимаемое файлом GDBM, эта процедура переорганизует базу данных. `gdbm` объекты не уменьшат размер файла базы данных иначе, чем с помощью такой переорганизации; в противном случае освобождённое пространство файла будет сохраняться и повторно использоваться при добавлении новых пар (ключ, значение).169170#### `gdbm.sync()`171172Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.173174#### `gdbm.close()`175176Закрывает базу данных GDBM.177178## [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm) – Новый менеджер баз данных179180**Исходный код:** [Lib/dbm/ndbm.py](https://python-all.ru/src/3.11/Lib/dbm/ndbm.py)181182---183184Модуль [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm) предоставляет интерфейс к библиотеке NDBM. Этот модуль можно использовать как с «классическим» интерфейсом NDBM, так и с интерфейсом совместимости GDBM.185186> **Примечание**187>188> Форматы файлов, созданные с помощью [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu) и [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm), несовместимы и не могут использоваться взаимозаменяемо.189190> **Предупреждение**191>192> Библиотека NDBM, поставляемая в составе macOS, имеет недокументированное ограничение на размер значений, что может привести к повреждению файлов базы данных при сохранении значений, превышающих этот лимит. Чтение таких повреждённых файлов может привести к жёсткому сбою (ошибке сегментации).193194#### `exception dbm.ndbm.error`195196Возникает при ошибках, специфичных для [`dbm.ndbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm.ndbm), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.11/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.197198#### `dbm.ndbm.library`199200Имя используемой библиотеки реализации NDBM.201202#### `dbm.ndbm.open(filename, flag='r', mode=0o666, /)`203204Открывает базу данных NDBM и возвращает объект `ndbm`.205206**Параметры:**207208- **имя\_файла** ([объект, подобный пути](https://python-all.ru/3.11/glossary.html#term-path-like-object)) – базовое имя файла базы данных (без расширений `.dir` или `.pag`).209- **flag** ([*str*](https://python-all.ru/3.11/library/stdtypes.html#str)) –210211  - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.212  - `'w'`: Открыть существующую базу данных для чтения и записи.213  - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.214  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.215- **mode** ([*int*](https://python-all.ru/3.11/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.216217Объекты `ndbm` ведут себя подобно [отображениям](https://python-all.ru/3.11/glossary.html#term-mapping), но методы `items()` и `values()` не поддерживаются. Также предоставлены следующие методы:218219Изменено в версии 3.11: Принимает [объект, подобный пути](https://python-all.ru/3.11/glossary.html#term-path-like-object) для имени файла.220221#### `ndbm.close()`222223Закрывает базу данных NDBM.224225## [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb) – переносимая реализация DBM226227**Исходный код:** [Lib/dbm/dumb.py](https://python-all.ru/src/3.11/Lib/dbm/dumb.py)228229> **Примечание**230>231> Модуль [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb) предназначен в качестве запасного варианта для модуля [`dbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm), когда более надёжный модуль недоступен. Модуль [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb) не оптимизирован для скорости и используется не так интенсивно, как другие модули баз данных.232233---234235Модуль [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb) предоставляет постоянный (persistent) интерфейс, подобный [`dict`](https://python-all.ru/3.11/library/stdtypes.html#dict), полностью написанный на Python. В отличие от других бэкендов [`dbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm), таких как [`dbm.gnu`](https://python-all.ru/3.11/library/dbm.html#module-dbm.gnu), не требуется внешняя библиотека.236237Модуль `dbm.dumb` определяет следующее:238239#### `exception dbm.dumb.error`240241Возникает при ошибках, специфичных для [`dbm.dumb`](https://python-all.ru/3.11/library/dbm.html#module-dbm.dumb), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.11/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.242243#### `dbm.dumb.open(filename, flag='c', mode=0o666)`244245Открывает базу данных `dbm.dumb`. Возвращаемый объект базы данных ведет себя подобно [отображению](https://python-all.ru/3.11/glossary.html#term-mapping), а также предоставляет методы [`sync()`](https://python-all.ru/3.11/library/dbm.html#dbm.dumb.dumbdbm.sync) и [`close()`](https://python-all.ru/3.11/library/dbm.html#dbm.dumb.dumbdbm.close).246247**Параметры:**248249- **filename**250251  Базовое имя файла базы данных (без расширений). При создании новой базы данных появляются следующие файлы:252253  - `filename.dat`254  - `filename.dir`255- **flag** ([*str*](https://python-all.ru/3.11/library/stdtypes.html#str)) –256257  - `'r'`: Открыть существующую базу данных только для чтения.258  - `'w'`: Открыть существующую базу данных для чтения и записи.259  - `'c'` (по умолчанию): Открыть базу данных для чтения и записи, создавая её, если она не существует.260  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.261- **mode** ([*int*](https://python-all.ru/3.11/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.262263> **Предупреждение**264>265> Интерпретатор Python может аварийно завершиться при загрузке базы данных со достаточно большой/сложной записью из-за ограничений глубины стека в компиляторе AST Python.266267Изменено в версии 3.5: [`open()`](https://python-all.ru/3.11/library/dbm.html#dbm.dumb.open) всегда создаёт новую базу данных, когда *flag* равен `'n'`.268269Изменено в версии 3.8: База данных открывается только для чтения, если *flag* равен `'r'`. База данных не создаётся, если она не существует, когда *flag* равен `'r'` или `'w'`.270271Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.11/glossary.html#term-path-like-object).272273В дополнение к методам, предоставляемым классом [`collections.abc.MutableMapping`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.MutableMapping), предоставлены следующие методы:274275#### `dumbdbm.sync()`276277Синхронизировать каталог на диске и файлы данных. Этот метод вызывается методом `Shelve.sync()`.278279#### `dumbdbm.close()`280281Закрыть базу данных.282