configparser.md
1> **Источник:** https://python-all.ru/3.14/library/configparser.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `configparser` – Парсер конфигурационных файлов89**Исходный код:** [Lib/configparser.py](https://python-all.ru/src/3.14/Lib/configparser.py)1011---1213Этот модуль предоставляет класс [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser), реализующий базовый язык конфигурации, структура которого аналогична файлам INI в Microsoft Windows. Его можно использовать для написания программ на Python, которые конечные пользователи могут легко настраивать.1415> **Примечание**16>17> Эта библиотека *не* интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI из реестра Windows.1819> **См. также**20>21> **Модуль [`tomllib`](https://python-all.ru/3.14/library/tomllib.html#module-tomllib)**22>23> TOML – хорошо специфицированный формат для файлов конфигурации приложений. Он специально разработан как улучшенная версия INI.24>25> **Модуль [`shlex`](https://python-all.ru/3.14/library/shlex.html#module-shlex)**26>27> Поддержка создания мини-языков в стиле Unix shell, которые также можно использовать для файлов конфигурации приложений.28>29> **Модуль [`json`](https://python-all.ru/3.14/library/json.html#module-json)**30>31> Модуль `json` реализует подмножество синтаксиса JavaScript, которое иногда используется для конфигурации, но не поддерживает комментарии.3233## Быстрый старт3435Рассмотрим простейший конфигурационный файл, который выглядит так:3637```ini38[DEFAULT]39ServerAliveInterval = 4540Compression = yes41CompressionLevel = 942ForwardX11 = yes4344[forge.example]45User = hg4647[topsecret.server.example]48Port = 5002249ForwardX11 = no50```5152Структура INI-файлов описана [в следующем разделе](https://python-all.ru/3.14/library/configparser.html#supported-ini-file-structure). По существу, файл состоит из секций, каждая из которых содержит ключи со значениями. Класс `configparser` может читать и записывать такие файлы. Начнем с программного создания приведенного выше конфигурационного файла.5354```pycon55>>> import configparser56>>> config = configparser.ConfigParser()57>>> config['DEFAULT'] = {'ServerAliveInterval': '45',58... 'Compression': 'yes',59... 'CompressionLevel': '9'}60>>> config['forge.example'] = {}61>>> config['forge.example']['User'] = 'hg'62>>> config['topsecret.server.example'] = {}63>>> topsecret = config['topsecret.server.example']64>>> topsecret['Port'] = '50022' # изменяет парсер65>>> topsecret['ForwardX11'] = 'no' # то же самое66>>> config['DEFAULT']['ForwardX11'] = 'yes'67>>> with open('example.ini', 'w') as configfile:68... config.write(configfile)69...70```7172Как видите, парсер конфигураций можно использовать почти как словарь. Есть различия, [описанные далее](https://python-all.ru/3.14/library/configparser.html#mapping-protocol-access), но поведение очень близко к тому, что можно ожидать от словаря.7374Теперь, когда мы создали и сохранили конфигурационный файл, давайте прочитаем его и изучим содержащиеся в нем данные.7576```pycon77>>> config = configparser.ConfigParser()78>>> config.sections()79[]80>>> config.read('example.ini')81['example.ini']82>>> config.sections()83['forge.example', 'topsecret.server.example']84>>> 'forge.example' in config85True86>>> 'python.org' in config87False88>>> config['forge.example']['User']89'hg'90>>> config['DEFAULT']['Compression']91'yes'92>>> topsecret = config['topsecret.server.example']93>>> topsecret['ForwardX11']94'no'95>>> topsecret['Port']96'50022'97>>> for key in config['forge.example']:98... print(key)99user100compressionlevel101serveraliveinterval102compression103forwardx11104>>> config['forge.example']['ForwardX11']105'yes'106```107108Как видно выше, API довольно прост. Единственная «магия» – это секция `DEFAULT`, которая предоставляет значения по умолчанию для всех остальных секций [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16). Также обратите внимание, что ключи в секциях нечувствительны к регистру и хранятся в нижнем регистре [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16).109110Можно прочитать несколько конфигураций в один [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser), причем самая последняя добавленная конфигурация имеет наивысший приоритет. Любые конфликтующие ключи берутся из более новой конфигурации, а ранее существовавшие ключи сохраняются. В приведенном ниже примере читается файл `override.ini`, который переопределит любые конфликтующие ключи из файла `example.ini`.111112```ini113[DEFAULT]114ServerAliveInterval = -1115```116117```pycon118>>> config_override = configparser.ConfigParser()119>>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'}120>>> with open('override.ini', 'w') as configfile:121... config_override.write(configfile)122...123>>> config_override = configparser.ConfigParser()124>>> config_override.read(['example.ini', 'override.ini'])125['example.ini', 'override.ini']126>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))127-1128```129130Это поведение эквивалентно вызову [`ConfigParser.read()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read) с несколькими файлами, переданными в параметр *filenames*.131132## Поддерживаемые типы данных133134Парсеры конфигураций не угадывают типы данных значений в конфигурационных файлах, а всегда хранят их внутри как строки. Это означает, что если вам нужны другие типы данных, преобразование нужно выполнять самостоятельно:135136```pycon137>>> int(topsecret['Port'])13850022139>>> float(topsecret['CompressionLevel'])1409.0141```142143Поскольку эта задача встречается часто, парсеры конфигураций предоставляют ряд удобных методов-геттеров для работы с целыми числами, числами с плавающей точкой и булевыми значениями. Последний тип наиболее интересен, потому что простая передача значения в `bool()` не даст результата, поскольку `bool('False')` все еще является `True`. Именно поэтому парсеры конфигураций также предоставляют метод [`getboolean()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getboolean). Этот метод нечувствителен к регистру и распознает булевы значения из `'yes'`/`'no'`, `'on'`/`'off'`, `'true'`/`'false'` и `'1'`/`'0'` [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16). Например:144145```pycon146>>> topsecret.getboolean('ForwardX11')147False148>>> config['forge.example'].getboolean('ForwardX11')149True150>>> config.getboolean('forge.example', 'Compression')151True152```153154Помимо [`getboolean()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getboolean), парсеры конфигураций также предоставляют эквивалентные методы [`getint()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getint) и [`getfloat()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getfloat). Вы можете зарегистрировать собственные преобразователи и настроить предоставленные. [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16)155156## Резервные значения157158Как и в словаре, для указания резервных значений можно использовать метод [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get) секции:159160```pycon161>>> topsecret.get('Port')162'50022'163>>> topsecret.get('CompressionLevel')164'9'165>>> topsecret.get('Cipher')166>>> topsecret.get('Cipher', '3des-cbc')167'3des-cbc'168```169170Обратите внимание, что значения по умолчанию имеют приоритет над резервными. Например, в нашем примере ключ `'CompressionLevel'` был указан только в секции `'DEFAULT'`. Если мы попытаемся получить его из секции `'topsecret.server.example'`, мы всегда получим значение по умолчанию, даже если указано резервное:171172```pycon173>>> topsecret.get('CompressionLevel', '3')174'9'175```176177Еще одна деталь: метод [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get) на уровне парсера предоставляет собственный, более сложный интерфейс, сохраненный для обратной совместимости. При использовании этого метода резервное значение можно передать через именованный аргумент `fallback`:178179```pycon180>>> config.get('forge.example', 'monster',181... fallback='No such things as monsters')182'No such things as monsters'183```184185Тот же аргумент `fallback` можно использовать с методами [`getint()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getint), [`getfloat()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getfloat) и [`getboolean()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getboolean), например:186187```pycon188>>> 'BatchMode' in topsecret189False190>>> topsecret.getboolean('BatchMode', fallback=True)191True192>>> config['DEFAULT']['BatchMode'] = 'no'193>>> topsecret.getboolean('BatchMode', fallback=True)194False195```196197## Поддерживаемая структура INI-файлов198199Конфигурационный файл состоит из секций, каждая из которых начинается с заголовка `[section]`, за которым следуют пары ключ/значение, разделенные определенной строкой (по умолчанию `=` или `:` [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16)). По умолчанию имена секций чувствительны к регистру, а ключи – нет [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16). Начальные и конечные пробелы удаляются из ключей и значений. Значения могут быть опущены, если парсер настроен на разрешение этого [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16); в этом случае разделитель ключа и значения также может быть опущен. Значения также могут занимать несколько строк, если они имеют отступ глубже, чем первая строка значения. В зависимости от режима парсера пустые строки могут рассматриваться как часть многострочных значений или игнорироваться.200201По умолчанию допустимое имя секции – любая строка, не содержащая ‘\\n’. Чтобы изменить это, см. [`ConfigParser.SECTCRE`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.SECTCRE).202203Имя первой секции может быть опущено, если парсер настроен на разрешение безымянной секции верхнего уровня с помощью `allow_unnamed_section=True`. В этом случае ключи/значения могут быть получены через [`UNNAMED_SECTION`](https://python-all.ru/3.14/library/configparser.html#configparser.UNNAMED_SECTION), как в `config[UNNAMED_SECTION]`.204205Конфигурационные файлы могут содержать комментарии, начинающиеся с определенных символов (по умолчанию `#` и `;` [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16)). Комментарии могут располагаться на отдельной пустой строке, возможно с отступом. [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16)206207Например:208209```ini210[Simple Values]211key=value212spaces in keys=allowed213spaces in values=allowed as well214spaces around the delimiter = obviously215you can also use : to delimit keys from values216217[All Values Are Strings]218values like this: 1000000219or this: 3.14159265359220are they treated as numbers? : no221integers, floats and booleans are held as: strings222can use the API to get converted values directly: true223224[Multiline Values]225chorus: I'm a lumberjack, and I'm okay226 I sleep all night and I work all day227228[No Values]229key_without_value230empty string value here =231232[You can use comments]233# как этот234; или этот235236# По умолчанию только в пустой строке.237# Встроенные комментарии могут быть вредны, поскольку не позволяют пользователям238# использовать разделительные символы как части значений.239# Тем не менее, это можно настроить.240241 [Sections Can Be Indented]242 can_values_be_as_well = True243 does_that_mean_anything_special = False244 purpose = formatting for readability245 multiline_values = are246 handled just fine as247 long as they are indented248 deeper than the first line249 of a value250 # Кстати, комментарии тоже можно делать с отступом.251```252253## Безымянные секции254255Имя первого (или единственного) раздела можно опускать, а значения получать через атрибут [`UNNAMED_SECTION`](https://python-all.ru/3.14/library/configparser.html#configparser.UNNAMED_SECTION).256257```pycon258>>> config = """259... option = value260...261... [ Section 2 ]262... another = val263... """264>>> unnamed = configparser.ConfigParser(allow_unnamed_section=True)265>>> unnamed.read_string(config)266>>> unnamed.get(configparser.UNNAMED_SECTION, 'option')267'value'268```269270## Интерполяция значений271272Помимо основной функциональности, [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser) поддерживает интерполяцию. Это означает, что значения могут обрабатываться перед тем, как быть возвращёнными из вызовов `get()`.273274#### `class configparser.BasicInterpolation`275276Реализация по умолчанию, используемая в [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser). Она позволяет значениям содержать строки форматирования, ссылающиеся на другие значения в том же разделе или на значения в специальном разделе по умолчанию [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16). Дополнительные значения по умолчанию можно указать при инициализации.277278Например:279280```ini281[Paths]282home_dir: /Users283my_dir: %(home_dir)s/lumberjack284my_pictures: %(my_dir)s/Pictures285286[Escape]287# используйте %% для экранирования символа % (% – единственный символ, требующий экранирования):288gain: 80%%289```290291В примере выше [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser) с параметром *interpolation*, установленным в `BasicInterpolation()`, преобразовал бы `%(home_dir)s` в значение `home_dir` (в данном случае `/Users`). `%(my_dir)s`, в свою очередь, преобразовалось бы в `/Users/lumberjack`. Все подстановки выполняются по требованию, поэтому ключи, используемые в цепочке ссылок, не обязаны быть указаны в каком-либо определённом порядке в конфигурационном файле.292293Если `interpolation` установлен в `None`, анализатор просто вернёт `%(my_dir)s/Pictures` как значение `my_pictures` и `%(home_dir)s/lumberjack` как значение `my_dir`.294295#### `class configparser.ExtendedInterpolation`296297Альтернативный обработчик для интерполяции, реализующий более сложный синтаксис, используемый, например, в `zc.buildout`. Расширенная интерполяция использует `${section:option}` для обозначения значения из другого раздела. Интерполяция может быть многоуровневой. Для удобства, если часть `section:` опущена, интерполяция по умолчанию берётся из текущего раздела (а также из значений по умолчанию из специального раздела).298299Например, конфигурация, заданная выше с базовой интерполяцией, с расширенной интерполяцией будет выглядеть так:300301```ini302[Paths]303home_dir: /Users304my_dir: ${home_dir}/lumberjack305my_pictures: ${my_dir}/Pictures306307[Escape]308# используйте $$ для экранирования символа $ ($ – единственный символ, требующий экранирования):309cost: $$80310```311312Значения из других разделов также можно получать:313314```ini315[Common]316home_dir: /Users317library_dir: /Library318system_dir: /System319macports_dir: /opt/local320321[Frameworks]322Python: 3.2323path: ${Common:system_dir}/Library/Frameworks/324325[Arthur]326nickname: Two Sheds327last_name: Jackson328my_dir: ${Common:home_dir}/twosheds329my_pictures: ${my_dir}/Pictures330python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}331```332333## Доступ через протокол отображения334335Добавлено в версии 3.2.336337Доступ через протокол отображения – это общее название функциональности, позволяющей использовать пользовательские объекты как словари. В случае `configparser` реализация интерфейса отображения использует нотацию `parser['section']['option']`.338339`parser['section']`, в частности, возвращает прокси для данных раздела в анализаторе. Это означает, что значения не копируются, а берутся из исходного анализатора по требованию. Что ещё более важно: при изменении значений в прокси-разделе они фактически изменяются и в исходном анализаторе.340341Объекты `configparser` ведут себя максимально близко к настоящим словарям. Интерфейс отображения реализован полностью и соответствует абстрактному базовому классу [`MutableMapping`](https://python-all.ru/3.14/library/collections.abc.html#collections.abc.MutableMapping). Однако есть несколько различий, которые следует учитывать:342343- По умолчанию все ключи в разделах доступны без учёта регистра [\[1\]](https://python-all.ru/3.14/library/configparser.html#id16). Например, `for option in parser["section"]` возвращает только имена опций, приведённые к `optionxform`. По умолчанию это означает ключи в нижнем регистре. В то же время для раздела, содержащего ключ `'a'`, оба выражения вернут `True`:344345 ```python346 "a" in parser["section"]347 "A" in parser["section"]348 ```349- Все разделы также содержат значения `DEFAULTSECT`, то есть `.clear()`, применённый к разделу, может не оставить его видимо пустым. Это связано с тем, что значения по умолчанию нельзя удалить из раздела (технически их там нет). Если они переопределены в разделе, удаление приводит к тому, что значение по умолчанию снова становится видимым. Попытка удалить значение по умолчанию вызывает [`KeyError`](https://python-all.ru/3.14/library/exceptions.html#KeyError).350- `DEFAULTSECT` нельзя удалить из анализатора:351352 - попытка удалить его вызывает [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError),353 - `parser.clear()` оставляет его нетронутым,354 - `parser.popitem()` никогда его не возвращает.355- `parser.get(section, option, **kwargs)` – второй аргумент **не** является запасным значением. Однако обратите внимание, что методы `get()` на уровне раздела совместимы как с протоколом отображения, так и с классическим API configparser.356- `parser.items()` совместим с протоколом отображения (возвращает список пар *название\_раздела*, *прокси\_раздела*, включая DEFAULTSECT). Однако этот метод также может быть вызван с аргументами: `parser.items(section, raw, vars)`. Последний вызов возвращает список пар *опция*, *значение* для указанного `section`, со всеми раскрытыми интерполяциями (если не указан `raw=True`).357358Протокол отображения реализован поверх существующего устаревшего API, поэтому подклассы, переопределяющие исходный интерфейс, по-прежнему должны работать с отображением, как и ожидается.359360## Настройка поведения анализатора361362Вариантов формата INI почти столько же, сколько приложений, его использующих. `configparser` прилагает большие усилия для поддержки максимально широкого набора стилей INI. Функциональность по умолчанию в основном продиктована историческим опытом, и вполне вероятно, что вам потребуется настроить некоторые возможности.363364Самый распространённый способ изменить поведение конкретного анализатора конфигурации – использовать опции `__init__()`:365366- *defaults*, значение по умолчанию: `None`367368 Эта опция принимает словарь пар ключ-значение, которые изначально помещаются в раздел `DEFAULT`. Это позволяет элегантно поддерживать лаконичные конфигурационные файлы, в которых не указываются значения, совпадающие с задокументированными значениями по умолчанию.369370 Подсказка: если нужно задать значения по умолчанию для конкретного раздела, используйте [`read_dict()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read_dict) до чтения самого файла.371- *dict\_type*, значение по умолчанию: [`dict`](https://python-all.ru/3.14/library/stdtypes.html#dict)372373 Эта опция существенно влияет на поведение протокола отображения и на внешний вид записанных конфигурационных файлов. Со стандартным словарём каждый раздел хранится в порядке добавления в анализатор. То же самое касается опций внутри разделов.374375 Другой тип словаря можно использовать, например, для сортировки разделов и параметров при записи обратно.376377 Обратите внимание: существуют способы добавить набор пар ключ-значение за одну операцию. При использовании обычного словаря в таких операциях порядок ключей будет упорядочен. Например:378379 ```pycon380 >>> parser = configparser.ConfigParser()381 >>> parser.read_dict({'section1': {'key1': 'value1',382 ... 'key2': 'value2',383 ... 'key3': 'value3'},384 ... 'section2': {'keyA': 'valueA',385 ... 'keyB': 'valueB',386 ... 'keyC': 'valueC'},387 ... 'section3': {'foo': 'x',388 ... 'bar': 'y',389 ... 'baz': 'z'}390 ... })391 >>> parser.sections()392 ['section1', 'section2', 'section3']393 >>> [option for option in parser['section3']]394 ['foo', 'bar', 'baz']395 ```396- *allow\_no\_value*, значение по умолчанию: `False`397398 Известно, что некоторые конфигурационные файлы содержат настройки без значений, но в остальном соответствуют синтаксису, поддерживаемому `configparser`. Параметр *allow\_no\_value* конструктора можно использовать, чтобы указать, что такие значения следует принимать:399400 ```pycon401 >>> import configparser402403 >>> sample_config = """404 ... [mysqld]405 ... user = mysql406 ... pid-file = /var/run/mysqld/mysqld.pid407 ... skip-external-locking408 ... old_passwords = 1409 ... skip-bdb410 ... # we don't need ACID today411 ... skip-innodb412 ... """413 >>> config = configparser.ConfigParser(allow_no_value=True)414 >>> config.read_string(sample_config)415416 >>> # Настройки со значениями обрабатываются как и раньше:417 >>> config["mysqld"]["user"]418 'mysql'419420 >>> # Настройки без значений дают None:421 >>> config["mysqld"]["skip-bdb"]422423 >>> # Настройки, которые не указаны, по-прежнему вызывают ошибку:424 >>> config["mysqld"]["does-not-exist"]425 Traceback (most recent call last):426 ...427 KeyError: 'does-not-exist'428 ```429- *delimiters*, значение по умолчанию: `('=', ':')`430431 Разделители – это подстроки, которые отделяют ключи от значений внутри раздела. Первое вхождение такой подстроки в строке считается разделителем. Это означает, что значения (но не ключи) могут содержать разделители.432433 См. также аргумент *space\_around\_delimiters* для [`ConfigParser.write()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.write).434- *comment\_prefixes*, значение по умолчанию: `('#', ';')`435- *inline\_comment\_prefixes*, значение по умолчанию: `None`436437 Префиксы комментариев – это строки, указывающие начало допустимого комментария в конфигурационном файле. *comment\_prefixes* используются только на пустых строках (возможно, с отступом), тогда как *inline\_comment\_prefixes* могут использоваться после любого допустимого значения (например, названий разделов, параметров и пустых строк). По умолчанию строчные комментарии отключены, а в качестве префиксов для комментариев на всю строку используются `'#'` и `';'`.438439 Изменено в версии 3.2: В предыдущих версиях `configparser` поведение соответствовало `comment_prefixes=('#',';')` и `inline_comment_prefixes=(';',)`.440441 Обратите внимание: парсеры конфигурации не поддерживают экранирование префиксов комментариев, поэтому использование *inline\_comment\_prefixes* может помешать пользователям указывать значения параметров, содержащие символы, используемые как префиксы комментариев. Если сомневаетесь, избегайте установки *inline\_comment\_prefixes*. В любом случае, единственный способ сохранить символы префикса комментария в начале строки в многострочных значениях – это интерполировать префикс, например:442443 ```python444 >>> from configparser import ConfigParser, ExtendedInterpolation445 >>> parser = ConfigParser(interpolation=ExtendedInterpolation())446 >>> # можно также использовать стандартный BasicInterpolation447 >>> parser.read_string("""448 ... [DEFAULT]449 ... hash = #450 ...451 ... [hashes]452 ... shebang =453 ... ${hash}!/usr/bin/env python454 ... ${hash} -*- coding: utf-8 -*-455 ...456 ... extensions =457 ... enabled_extension458 ... another_extension459 ... #disabled_by_comment460 ... yet_another_extension461 ...462 ... interpolation not necessary = if # is not at line start463 ... even in multiline values = line #1464 ... line #2465 ... line #3466 ... """)467 >>> print(parser['hashes']['shebang'])468469 #!/usr/bin/env python470 # -*- coding: utf-8 -*-471 >>> print(parser['hashes']['extensions'])472473 enabled_extension474 another_extension475 yet_another_extension476 >>> print(parser['hashes']['interpolation not necessary'])477 if # is not at line start478 >>> print(parser['hashes']['even in multiline values'])479 line #1480 line #2481 line #3482 ```483- *strict*, значение по умолчанию: `True`484485 Если установлено `True`, парсер не допускает дублирования разделов или параметров при чтении из одного источника (с помощью [`read_file()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read_file), [`read_string()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read_string) или [`read_dict()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read_dict)). В новых приложениях рекомендуется использовать строгие парсеры.486487 Изменено в версии 3.2: В предыдущих версиях `configparser` поведение соответствовало `strict=False`.488- *empty\_lines\_in\_values*, значение по умолчанию: `True`489490 В парсерах конфигурации значения могут занимать несколько строк, если их отступ больше, чем у ключа, к которому они относятся. По умолчанию парсеры также допускают, чтобы пустые строки были частью значений. В то же время сами ключи могут иметь произвольный отступ для улучшения читаемости. В результате, когда конфигурационные файлы становятся большими и сложными, пользователю легко потерять представление о структуре файла. Рассмотрим пример:491492 ```ini493 [Section]494 key = multiline495 value with a gotcha496497 this = is still a part of the multiline value of 'key'498 ```499500 Это может быть особенно проблематично для пользователя, если он использует пропорциональный шрифт для редактирования файла. Вот почему, если вашему приложению не нужны значения с пустыми строками, стоит рассмотреть возможность их запрета. Это приведёт к тому, что пустые строки будут каждый раз разделять ключи. В приведённом выше примере получилось бы два ключа: `key` и `this`.501- *default\_section*, значение по умолчанию: `configparser.DEFAULTSECT` (то есть `"DEFAULT"`)502503 Возможность выделить специальный раздел со значениями по умолчанию для других разделов или для интерполяции – это мощная концепция данной библиотеки, позволяющая пользователям создавать сложные декларативные конфигурации. Этот раздел обычно называется `"DEFAULT"`, однако его можно настроить на любое другое допустимое имя раздела. Некоторые типичные значения: `"general"` или `"common"`. Указанное имя используется для распознавания разделов по умолчанию при чтении из любого источника, а также при записи конфигурации обратно в файл. Текущее значение можно получить через атрибут `parser_instance.default_section` и изменить во время выполнения (например, для преобразования файлов из одного формата в другой).504- *interpolation*, значение по умолчанию: `configparser.BasicInterpolation`505506 Поведение интерполяции можно настроить, передав собственный обработчик через аргумент *interpolation*. `None` позволяет полностью отключить интерполяцию, `ExtendedInterpolation()` предоставляет более продвинутый вариант, вдохновлённый `zc.buildout`. Подробнее об этом в [соответствующем разделе документации](https://python-all.ru/3.14/library/configparser.html#interpolation-of-values). [`RawConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.RawConfigParser) имеет значение по умолчанию `None`.507- *converters*, значение по умолчанию: не задано508509 Парсеры конфигурации предоставляют геттеры значений параметров, выполняющие преобразование типов. По умолчанию реализованы [`getint()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getint), [`getfloat()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getfloat) и [`getboolean()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getboolean). Если нужны другие геттеры, пользователи могут определить их в подклассе или передать словарь, где каждый ключ – имя преобразователя, а каждое значение – вызываемый объект, реализующий это преобразование. Например, передача `{'decimal': decimal.Decimal}` добавит `getdecimal()` как на объект парсера, так и на все прокси разделов. Другими словами, станет возможным писать как `parser_instance.getdecimal('section', 'key', fallback=0)`, так и `parser_instance['section'].getdecimal('key', 0)`.510511 Если преобразователю требуется доступ к состоянию парсера, его можно реализовать как метод подкласса парсера конфигурации. Если имя этого метода начинается с `get`, он будет доступен на всех прокси разделов в dict-совместимой форме (см. пример `getdecimal()` выше).512513Более тонкую настройку можно выполнить, переопределив значения по умолчанию этих атрибутов парсера. Значения по умолчанию заданы на уровне классов, поэтому их можно переопределить в подклассах или путём присваивания атрибуту.514515#### `ConfigParser.BOOLEAN_STATES`516517По умолчанию при использовании [`getboolean()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.getboolean) парсеры конфигурации считают следующие значения `True`: `'1'`, `'yes'`, `'true'`, `'on'`, а следующие значения `False`: `'0'`, `'no'`, `'false'`, `'off'`. Вы можете переопределить это, указав свой словарь строк и соответствующих им логических значений. Например:518519```pycon520>>> custom = configparser.ConfigParser()521>>> custom['section1'] = {'funky': 'nope'}522>>> custom['section1'].getboolean('funky')523Traceback (most recent call last):524...525ValueError: Not a boolean: nope526>>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}527>>> custom['section1'].getboolean('funky')528False529```530531Другие типичные логические пары: `accept`/`reject` или `enabled`/`disabled`.532533#### `ConfigParser.optionxform(option)`534535Этот метод преобразует имена параметров при каждой операции чтения, получения или установки. По умолчанию он приводит имя к нижнему регистру. Это также означает, что при записи конфигурационного файла все ключи будут в нижнем регистре. Переопределите этот метод, если такое поведение не подходит. Например:536537```pycon538>>> config = """539... [Section1]540... Key = Value541...542... [Section2]543... AnotherKey = Value544... """545>>> typical = configparser.ConfigParser()546>>> typical.read_string(config)547>>> list(typical['Section1'].keys())548['key']549>>> list(typical['Section2'].keys())550['anotherkey']551>>> custom = configparser.RawConfigParser()552>>> custom.optionxform = lambda option: option553>>> custom.read_string(config)554>>> list(custom['Section1'].keys())555['Key']556>>> list(custom['Section2'].keys())557['AnotherKey']558```559560> **Примечание**561>562> Функция optionxform преобразует имена параметров в каноническую форму. Это должна быть идемпотентная функция: если имя уже имеет каноническую форму, оно должно возвращаться без изменений.563564#### `ConfigParser.SECTCRE`565566Скомпилированное регулярное выражение для разбора заголовков разделов. По умолчанию сопоставляет `[section]` с именем `"section"`. Пробельные символы считаются частью имени раздела, поэтому `[ larch ]` будет прочитан как раздел с именем `" larch "`. Переопределите этот атрибут, если это не подходит. Например:567568```pycon569>>> import re570>>> config = """571... [Section 1]572... option = value573...574... [ Section 2 ]575... another = val576... """577>>> typical = configparser.ConfigParser()578>>> typical.read_string(config)579>>> typical.sections()580['Section 1', ' Section 2 ']581>>> custom = configparser.ConfigParser()582>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")583>>> custom.read_string(config)584>>> custom.sections()585['Section 1', 'Section 2']586```587588> **Примечание**589>590> Хотя объекты ConfigParser также используют атрибут `OPTCRE` для распознавания строк с опциями, переопределять его не рекомендуется, так как это помешает работе параметров конструктора *allow\_no\_value* и *delimiters*.591592## Примеры устаревшего API593594В основном из соображений обратной совместимости `configparser` также предоставляет устаревший API с явными методами `get`/`set`. Хотя у методов, перечисленных ниже, есть свои обоснованные сценарии использования, для новых проектов предпочтительнее доступ через протокол отображения. Устаревший API иногда более продвинутый, низкоуровневый и откровенно неинтуитивный.595596Пример записи в файл конфигурации:597598```python599import configparser600601config = configparser.RawConfigParser()602603# Обратите внимание: используя функции set класса RawConfigParser, можно присваивать604# ключам внутренние значения, не являющиеся строками, но при попытке605# записи в файл или при получении значения в не-сыром режиме возникнет ошибка. Присваивание606# значений через протокол отображения или ConfigParser.set() не допускает607# выполнения таких присваиваний.608config.add_section('Section1')609config.set('Section1', 'an_int', '15')610config.set('Section1', 'a_bool', 'true')611config.set('Section1', 'a_float', '3.1415')612config.set('Section1', 'baz', 'fun')613config.set('Section1', 'bar', 'Python')614config.set('Section1', 'foo', '%(bar)s is %(baz)s!')615616# Записываем наш конфигурационный файл в 'example.cfg'617with open('example.cfg', 'w') as configfile:618 config.write(configfile)619```620621Пример повторного чтения файла конфигурации:622623```python624import configparser625626config = configparser.RawConfigParser()627config.read('example.cfg')628629# getfloat() вызывает исключение, если значение не является float.630# getint() и getboolean() делают то же самое для своих типов.631a_float = config.getfloat('Section1', 'a_float')632an_int = config.getint('Section1', 'an_int')633print(a_float + an_int)634635# Обратите внимание, что следующий вывод не интерполирует '%(bar)s' или '%(baz)s'.636# Это потому, что мы используем RawConfigParser().637if config.getboolean('Section1', 'a_bool'):638 print(config.get('Section1', 'foo'))639```640641Чтобы получить интерполяцию, используйте [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser):642643```python644import configparser645646cfg = configparser.ConfigParser()647cfg.read('example.cfg')648649# Установите необязательный аргумент *raw* метода get() в True, если требуется отключить650# интерполяцию в одной операции get.651print(cfg.get('Section1', 'foo', raw=False)) # -> "Python – это весело!"652print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s – это %(baz)s!"653654# Необязательный аргумент *vars* – это словарь с элементами, которые будут иметь655# приоритет при интерполяции.656print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',657 'baz': 'evil'}))658659# Необязательный аргумент *fallback* можно использовать для предоставления запасного значения660print(cfg.get('Section1', 'foo'))661 # -> "Python – это весело!"662663print(cfg.get('Section1', 'foo', fallback='Monty is not.'))664 # -> "Python – это весело!"665666print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))667 # -> "Монстров не существует."668669# Голый вызов print(cfg.get('Section1', 'monster')) вызовет NoOptionError, но мы также можем использовать:670# но мы также можем использовать:671672print(cfg.get('Section1', 'monster', fallback=None))673 # -> None674```675676Значения по умолчанию доступны в обоих типах ConfigParsers. Они используются при интерполяции, если используемая опция не определена в другом месте.677678```python679import configparser680681# Новый экземпляр с 'bar' и 'baz', по умолчанию равными 'Life' и 'hard' соответственно.682config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})683config.read('example.cfg')684685print(config.get('Section1', 'foo')) # -> "Python – это весело!"686config.remove_option('Section1', 'bar')687config.remove_option('Section1', 'baz')688print(config.get('Section1', 'foo')) # -> "Жизнь тяжела!"689```690691## Объекты ConfigParser692693#### `class configparser.ConfigParser(defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={}, allow_unnamed_section=False)`694695Основной парсер конфигурации. Когда задан *defaults*, он инициализируется как словарь внутренних значений по умолчанию. Когда задан *dict\_type*, он будет использоваться для создания словарей для списка разделов, опций внутри раздела и значений по умолчанию.696697Когда задан *delimiters*, он используется как набор подстрок, которые отделяют ключи от значений. Когда задан *comment\_prefixes*, он будет использоваться как набор подстрок, которые обозначают начало комментария в иначе пустых строках. Комментарии могут быть с отступом. Когда задан *inline\_comment\_prefixes*, он будет использоваться как набор подстрок, которые обозначают начало комментария в непустых строках.698699Когда *strict* равен `True` (по умолчанию), парсер не допускает повторяющихся разделов или опций при чтении из одного источника (файла, строки или словаря), вызывая [`DuplicateSectionError`](https://python-all.ru/3.14/library/configparser.html#configparser.DuplicateSectionError) или [`DuplicateOptionError`](https://python-all.ru/3.14/library/configparser.html#configparser.DuplicateOptionError). Когда *empty\_lines\_in\_values* равен `False` (по умолчанию: `True`), каждая пустая строка обозначает конец опции. В противном случае пустые строки внутри многострочной опции сохраняются как часть значения. Когда *allow\_no\_value* равен `True` (по умолчанию: `False`), опции без значений принимаются; значение для них равно `None`, и они сериализуются без завершающего разделителя.700701Когда задан *default\_section*, он указывает имя для специального раздела, содержащего значения по умолчанию для других разделов и для целей интерполяции (обычно называется `"DEFAULT"`). Это значение можно получить и изменить во время выполнения с помощью атрибута экземпляра `default_section`. Это не приведет к повторному разбору уже прочитанного файла конфигурации, но будет использоваться при записи разобранных настроек в новый файл конфигурации.702703Поведение интерполяции можно настроить, передав собственный обработчик через аргумент *interpolation*. `None` можно использовать для полного отключения интерполяции, `ExtendedInterpolation()` предоставляет более продвинутый вариант, вдохновлённый `zc.buildout`. Подробнее об этом в [соответствующем разделе документации](https://python-all.ru/3.14/library/configparser.html#interpolation-of-values).704705Все имена опций, используемые в интерполяции, передаются через метод [`optionxform()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.optionxform), как и любые другие ссылки на имена опций. Например, при использовании реализации по умолчанию `optionxform()` (которая преобразует имена опций в нижний регистр) значения `foo %(bar)s` и `foo %(BAR)s` эквивалентны.706707Когда задан *converters*, это должен быть словарь, где каждый ключ представляет имя конвертера типов, а каждое значение – вызываемый объект, реализующий преобразование из строки в нужный тип данных. Каждый конвертер получает свой собственный соответствующий метод `get*()` на объекте парсера и прокси-объектах разделов.708709Когда *allow\_unnamed\_section* равен `True` (по умолчанию: `False`), имя первого раздела можно опустить. См. раздел [«Разделы без имени»](https://python-all.ru/3.14/library/configparser.html#unnamed-sections).710711Можно прочитать несколько конфигураций в один `ConfigParser`, причем самая последняя добавленная конфигурация имеет наивысший приоритет. Любые конфликтующие ключи берутся из более новой конфигурации, а ранее существовавшие ключи сохраняются. В приведенном ниже примере читается файл `override.ini`, который переопределит любые конфликтующие ключи из файла `example.ini`.712713```ini714[DEFAULT]715ServerAliveInterval = -1716```717718```pycon719>>> config_override = configparser.ConfigParser()720>>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'}721>>> with open('override.ini', 'w') as configfile:722... config_override.write(configfile)723...724>>> config_override = configparser.ConfigParser()725>>> config_override.read(['example.ini', 'override.ini'])726['example.ini', 'override.ini']727>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))728-1729```730731Изменено в версии 3.1: Значение по умолчанию *dict\_type* – [`collections.OrderedDict`](https://python-all.ru/3.14/library/collections.html#collections.OrderedDict).732733Изменено в версии 3.2: Были добавлены *allow\_no\_value*, *delimiters*, *comment\_prefixes*, *strict*, *empty\_lines\_in\_values*, *default\_section* и *interpolation*.734735Изменено в версии 3.5: Был добавлен аргумент *converters*.736737Изменено в версии 3.7: Аргумент *defaults* теперь читается с помощью [`read_dict()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read_dict), что обеспечивает единообразное поведение парсера: нестроковые ключи и значения неявно преобразуются в строки.738739Изменено в версии 3.8: По умолчанию используется *dict\_type* [`dict`](https://python-all.ru/3.14/library/stdtypes.html#dict), поскольку теперь он сохраняет порядок вставки.740741Изменено в версии 3.13: Вызывает [`MultilineContinuationError`](https://python-all.ru/3.14/library/configparser.html#configparser.MultilineContinuationError), если *allow\_no\_value* равен `True`, а ключ без значения продолжается строкой с отступом.742743Изменено в версии 3.13: Добавлен аргумент *allow\_unnamed\_section*.744745#### `defaults()`746747Возвращает словарь, содержащий значения по умолчанию для экземпляра.748749#### `sections()`750751Возвращает список доступных разделов; *раздел по умолчанию* не включён в список.752753#### `add_section(section)`754755Добавляет раздел с именем *section* в экземпляр. Если раздел с таким именем уже существует, возбуждается [`DuplicateSectionError`](https://python-all.ru/3.14/library/configparser.html#configparser.DuplicateSectionError). Если передано имя *раздела по умолчанию*, возбуждается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError). Имя раздела должно быть строкой; в противном случае возбуждается [`TypeError`](https://python-all.ru/3.14/library/exceptions.html#TypeError).756757Изменено в версии 3.2: Имена разделов, не являющиеся строками, вызывают [`TypeError`](https://python-all.ru/3.14/library/exceptions.html#TypeError).758759#### `has_section(section)`760761Указывает, присутствует ли в конфигурации указанный *раздел*. *Раздел по умолчанию* не учитывается.762763#### `options(section)`764765Возвращает список доступных параметров в указанном *разделе*.766767#### `has_option(section, option)`768769Если указанный *раздел* существует и содержит указанный *параметр*, вернуть [`True`](https://python-all.ru/3.14/library/constants.html#True); в противном случае вернуть [`False`](https://python-all.ru/3.14/library/constants.html#False). Если указанный *раздел* равен [`None`](https://python-all.ru/3.14/library/constants.html#None) или пустой строке, подразумевается DEFAULT.770771#### `read(filenames, encoding=None)`772773Пытается прочитать и разобрать итерируемый объект с именами файлов, возвращая список имён файлов, которые были успешно разобраны.774775If *filenames* is a string, a [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes) object or a [path-like object](https://python-all.ru/3.14/glossary.html#term-path-like-object), it is treated as a single filename. If a file named in *filenames* cannot be opened, that file will be ignored. This is designed so that you can specify an iterable of potential configuration file locations (for example, the current directory, the user’s home directory, and some system-wide directory), and all existing configuration files in the iterable will be read.776777Если ни один из указанных файлов не существует, экземпляр `ConfigParser` будет содержать пустой набор данных. Приложение, которому требуется загрузить начальные значения из файла, должно загрузить необходимый файл или файлы с помощью [`read_file()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read_file) перед вызовом `read()` для дополнительных файлов:778779```python780import configparser, os781782config = configparser.ConfigParser()783config.read_file(open('defaults.cfg'))784config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],785 encoding='cp1250')786```787788Изменено в версии 3.2: Добавлен параметр *encoding*. Ранее все файлы читались с использованием кодировки по умолчанию для [`open()`](https://python-all.ru/3.14/library/functions.html#open).789790Changed in version 3.6.1: The *filenames* parameter accepts a [path-like object](https://python-all.ru/3.14/glossary.html#term-path-like-object).791792Изменено в версии 3.7: Параметр *filenames* принимает объект [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes).793794#### `read_file(f, source=None)`795796Читает и разбирает данные конфигурации из *f*, который должен быть итерируемым объектом, возвращающим строки Unicode (например, файлы, открытые в текстовом режиме).797798Необязательный аргумент *source* задаёт имя читаемого файла. Если он не указан и *f* имеет атрибут `name`, то он используется для *source*; по умолчанию `'<???>'`.799800Добавлено в версии 3.2: Заменяет `readfp()`.801802#### `read_string(string, source='<string>')`803804Разбирает данные конфигурации из строки.805806Необязательный аргумент *source* задаёт контекстно-зависимое имя переданной строки. Если не указан, используется `'<string>'`. Обычно это путь файловой системы или URL.807808Добавлено в версии 3.2.809810#### `read_dict(dictionary, source='<dict>')`811812Загружает конфигурацию из любого объекта, предоставляющего метод `items()`, подобный словарю. Ключи – это имена разделов, значения – словари с ключами и значениями, которые должны присутствовать в разделе. Если используемый тип словаря сохраняет порядок, разделы и их ключи будут добавлены по порядку. Значения автоматически преобразуются в строки.813814Необязательный аргумент *source* задаёт контекстно-зависимое имя переданного словаря. Если не указан, используется `<dict>`.815816Этот метод можно использовать для копирования состояния между парсерами.817818Добавлено в версии 3.2.819820#### `get(section, option, *, raw=False, vars=None[, fallback])`821822Получает значение *параметра* для указанного *раздела*. Если указан *vars*, он должен быть словарём. *Параметр* ищется в *vars* (если указан), *разделе* и в *DEFAULTSECT* в указанном порядке. Если ключ не найден и указан *fallback*, он используется как запасное значение. `None` может быть указан в качестве *запасного значения*.823824Все операции `'%'` интерполяции раскрываются в возвращаемых значениях, если только аргумент *raw* не равен true. Значения для ключей интерполяции ищутся так же, как и параметр.825826Изменено в версии 3.2: Аргументы *raw*, *vars* и *fallback* стали только ключевыми, чтобы защитить пользователей от попытки использовать третий аргумент в качестве запасного значения *fallback* (особенно при использовании протокола отображения).827828#### `getint(section, option, *, raw=False, vars=None[, fallback])`829830Удобный метод, который преобразует *параметр* в указанном *разделе* в целое число. См. [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get) для объяснения *raw*, *vars* и *fallback*.831832#### `getfloat(section, option, *, raw=False, vars=None[, fallback])`833834Удобный метод, который приводит *option* в указанном *section* к числу с плавающей запятой. См. [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.835836#### `getboolean(section, option, *, raw=False, vars=None[, fallback])`837838Удобный метод, который приводит *option* в указанном *section* к логическому значению. Обратите внимание, что допустимыми значениями для параметра являются `'1'`, `'yes'`, `'true'` и `'on'`, при которых этот метод возвращает `True`, а `'0'`, `'no'`, `'false'` и `'off'` – `False`. Строковые значения проверяются без учёта регистра. Любое другое значение приведёт к возбуждению исключения [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError). См. [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.839840#### `items(raw=False, vars=None)`841842#### `items(section, raw=False, vars=None)`843844Если *section* не указан, возвращает список пар *section\_name*, *section\_proxy*, включая DEFAULTSECT.845846В противном случае возвращает список пар *name*, *value* для параметров в указанном *section*. Необязательные аргументы имеют тот же смысл, что и для метода [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get).847848Изменено в версии 3.8: Элементы, присутствующие в *vars*, больше не появляются в результате. Предыдущее поведение смешивало фактические параметры анализатора с переменными, предоставленными для интерполяции.849850#### `set(section, option, value)`851852Если указанный раздел существует, устанавливает заданный параметр в указанное значение; в противном случае возбуждает исключение [`NoSectionError`](https://python-all.ru/3.14/library/configparser.html#configparser.NoSectionError). *option* и *value* должны быть строками; в противном случае возбуждается исключение [`TypeError`](https://python-all.ru/3.14/library/exceptions.html#TypeError).853854#### `write(fileobject, space_around_delimiters=True)`855856Записывает представление конфигурации в указанный [файловый объект](https://python-all.ru/3.14/glossary.html#term-file-object), который должен быть открыт в текстовом режиме (принимает строки). Это представление может быть разобрано будущим вызовом [`read()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read). Если *space\_around\_delimiters* равно true, разделители между ключами и значениями окружаются пробелами.857858Изменено в версии 3.14: Возбуждает InvalidWriteError, если при записи получилось бы представление, которое не может быть корректно разобрано будущим вызовом [`read()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read) из этого анализатора.859860> **Примечание**861>862> Комментарии в исходном файле конфигурации не сохраняются при обратной записи конфигурации. Что считается комментарием, зависит от заданных значений *comment\_prefix* и *inline\_comment\_prefix*.863864#### `remove_option(section, option)`865866Удаляет указанный *option* из указанного *section*. Если раздел не существует, возбуждает исключение [`NoSectionError`](https://python-all.ru/3.14/library/configparser.html#configparser.NoSectionError). Если параметр существовал и был удалён, возвращает [`True`](https://python-all.ru/3.14/library/constants.html#True); в противном случае возвращает [`False`](https://python-all.ru/3.14/library/constants.html#False).867868#### `remove_section(section)`869870Удаляет указанный *section* из конфигурации. Если раздел действительно существовал, возвращает `True`. В противном случае возвращает `False`.871872#### `optionxform(option)`873874Преобразует имя параметра *option*, как оно найдено во входном файле или передано клиентским кодом, в форму, которая должна использоваться во внутренних структурах. Реализация по умолчанию возвращает версию *option* в нижнем регистре; подклассы могут переопределить это, или клиентский код может установить атрибут с таким именем на экземплярах, чтобы повлиять на это поведение.875876Для использования этого метода не нужно создавать подкласс анализатора; можно также установить его на экземпляре, присвоив функцию, которая принимает строковый аргумент и возвращает строку. Установка его в `str`, например, сделает имена параметров чувствительными к регистру:877878```python879cfgparser = ConfigParser()880cfgparser.optionxform = str881```882883Обратите внимание, что при чтении файлов конфигурации пробельные символы вокруг имён параметров удаляются перед вызовом `optionxform()`.884885#### `configparser.UNNAMED_SECTION`886887Специальный объект, представляющий имя раздела, используемый для ссылки на безымянный раздел (см. [Безымянные разделы](https://python-all.ru/3.14/library/configparser.html#unnamed-sections)).888889#### `configparser.MAX_INTERPOLATION_DEPTH`890891Максимальная глубина рекурсивной интерполяции для [`get()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.get), когда параметр *raw* равен false. Это актуально только при использовании *интерполяция* по умолчанию.892893## Объекты RawConfigParser894895#### `class configparser.RawConfigParser(defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={}, allow_unnamed_section=False)`896897Устаревший вариант [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser). В нём интерполяция отключена по умолчанию, и он допускает нестроковые имена разделов, имена параметров и значения через свои небезопасные методы `add_section` и `set`, а также устаревшую обработку ключевого аргумента `defaults=`.898899Изменено в версии 3.2: Были добавлены *allow\_no\_value*, *delimiters*, *comment\_prefixes*, *strict*, *empty\_lines\_in\_values*, *default\_section* и *interpolation*.900901Изменено в версии 3.5: Был добавлен аргумент *converters*.902903Изменено в версии 3.8: По умолчанию используется *dict\_type* [`dict`](https://python-all.ru/3.14/library/stdtypes.html#dict), поскольку теперь он сохраняет порядок вставки.904905Изменено в версии 3.13: Добавлен аргумент *allow\_unnamed\_section*.906907> **Примечание**908>909> Рассмотрите возможность использования [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser) – он проверяет типы сохраняемых внутри значений. Если интерполяция не нужна, можно использовать `ConfigParser(interpolation=None)`.910911#### `add_section(section)`912913Добавляет в экземпляр раздел с именем *section* или [`UNNAMED_SECTION`](https://python-all.ru/3.14/library/configparser.html#configparser.UNNAMED_SECTION).914915Если указанный раздел уже существует, возбуждается [`DuplicateSectionError`](https://python-all.ru/3.14/library/configparser.html#configparser.DuplicateSectionError). Если передано имя *раздела по умолчанию*, возбуждается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError). Если передан [`UNNAMED_SECTION`](https://python-all.ru/3.14/library/configparser.html#configparser.UNNAMED_SECTION) и поддержка отключена, возбуждается [`UnnamedSectionDisabledError`](https://python-all.ru/3.14/library/configparser.html#configparser.UnnamedSectionDisabledError).916917Тип *section* не проверяется, что позволяет создавать разделы с нестроковыми именами. Это поведение не поддерживается и может вызывать внутренние ошибки.918919Изменено в версии 3.14: Добавлена поддержка [`UNNAMED_SECTION`](https://python-all.ru/3.14/library/configparser.html#configparser.UNNAMED_SECTION).920921#### `set(section, option, value)`922923Если указанный раздел существует, устанавливает указанный параметр в заданное значение; иначе возбуждает [`NoSectionError`](https://python-all.ru/3.14/library/configparser.html#configparser.NoSectionError). Хотя для *внутреннего* хранения нестроковых значений можно использовать `RawConfigParser` (или [`ConfigParser`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser) с параметром *raw*, установленным в true), полная функциональность (включая интерполяцию и вывод в файлы) достигается только при использовании строковых значений.924925Этот метод позволяет пользователям присваивать нестроковые значения ключам внутри. Такое поведение не поддерживается и приведет к ошибкам при попытке записи в файл или получении значения в несыром режиме. **Используйте API протокола отображения**, который не допускает таких присваиваний.926927## Исключения928929#### `exception configparser.Error`930931Базовый класс для всех прочих исключений `configparser`.932933#### `exception configparser.NoSectionError`934935Исключение, возбуждаемое, когда указанный раздел не найден.936937#### `exception configparser.DuplicateSectionError`938939Исключение, возбуждаемое, если [`add_section()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.add_section) вызывается с именем уже существующего раздела, или в строгих парсерах, когда раздел встречается более одного раза в одном входном файле, строке или словаре.940941Изменено в версии 3.2: Добавлены необязательные атрибуты и параметры *source* и *lineno* в `__init__()`.942943#### `exception configparser.DuplicateOptionError`944945Исключение, возбуждаемое строгими парсерами, если один параметр встречается дважды при чтении из одного файла, строки или словаря. Это позволяет отлавливать опечатки и ошибки, связанные с регистром символов: например, в словаре может быть два ключа, представляющих один и тот же конфигурационный ключ, регистр которого не учитывается.946947#### `exception configparser.NoOptionError`948949Исключение, возбуждаемое, когда указанный параметр не найден в указанном разделе.950951#### `exception configparser.InterpolationError`952953Базовый класс для исключений, возбуждаемых при возникновении проблем во время выполнения строковой интерполяции.954955#### `exception configparser.InterpolationDepthError`956957Исключение, возбуждаемое, когда строковая интерполяция не может быть завершена, поскольку количество итераций превышает [`MAX_INTERPOLATION_DEPTH`](https://python-all.ru/3.14/library/configparser.html#configparser.MAX_INTERPOLATION_DEPTH). Подкласс [`InterpolationError`](https://python-all.ru/3.14/library/configparser.html#configparser.InterpolationError).958959#### `exception configparser.InterpolationMissingOptionError`960961Исключение, возбуждаемое, когда параметр, на который есть ссылка из значения, не существует. Подкласс [`InterpolationError`](https://python-all.ru/3.14/library/configparser.html#configparser.InterpolationError).962963#### `exception configparser.InterpolationSyntaxError`964965Исключение, возбуждаемое, когда исходный текст, в который вносятся подстановки, не соответствует требуемому синтаксису. Подкласс [`InterpolationError`](https://python-all.ru/3.14/library/configparser.html#configparser.InterpolationError).966967#### `exception configparser.MissingSectionHeaderError`968969Исключение, возбуждаемое при попытке разобрать файл, не содержащий заголовков разделов.970971#### `exception configparser.ParsingError`972973Исключение, возникающее при ошибках во время разбора файла.974975Изменено в версии 3.12: Атрибут `filename` и аргумент конструктора `__init__()` были удалены. Они были доступны под именем `source` начиная с версии 3.2.976977#### `exception configparser.MultilineContinuationError`978979Исключение возникает, когда ключ без соответствующего значения продолжается строкой с отступом.980981Добавлено в версии 3.13.982983#### `exception configparser.UnnamedSectionDisabledError`984985Исключение возникает при попытке использовать [`UNNAMED_SECTION`](https://python-all.ru/3.14/library/configparser.html#configparser.UNNAMED_SECTION) без его включения.986987> Добавлено в версии 3.14.988989#### `exception configparser.InvalidWriteError`990991Исключение возникает, когда попытка [`ConfigParser.write()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.write) не будет точно разобрана при последующем вызове [`ConfigParser.read()`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.read).992993Пример: запись ключа, начинающегося с шаблона [`ConfigParser.SECTCRE`](https://python-all.ru/3.14/library/configparser.html#configparser.ConfigParser.SECTCRE), будет разобрана как заголовок раздела при чтении. Попытка записать это вызовет данное исключение.994995Добавлено в версии 3.14.996997Сноски998999\[1\]10001001([1](https://python-all.ru/3.14/library/configparser.html#id1),[2](https://python-all.ru/3.14/library/configparser.html#id2),[3](https://python-all.ru/3.14/library/configparser.html#id3),[4](https://python-all.ru/3.14/library/configparser.html#id4),[5](https://python-all.ru/3.14/library/configparser.html#id5),[6](https://python-all.ru/3.14/library/configparser.html#id6),[7](https://python-all.ru/3.14/library/configparser.html#id7),[8](https://python-all.ru/3.14/library/configparser.html#id8),[9](https://python-all.ru/3.14/library/configparser.html#id9),[10](https://python-all.ru/3.14/library/configparser.html#id11),[11](https://python-all.ru/3.14/library/configparser.html#id12))10021003Парсеры конфигураций допускают широкую настройку. Если вас интересует изменение поведения, описанного в сноске, обратитесь к разделу [Настройка поведения парсера](https://python-all.ru/3.14/library/configparser.html#customizing-parser-behaviour).1004