> **Источник:** https://python-all.ru/3.3/library/configparser.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 14.2. [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) – Парсер конфигурационных файлов

Этот модуль предоставляет класс [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser), реализующий базовый язык конфигурации со структурой, похожей на ту, что используется в INI-файлах Microsoft Windows. Его можно использовать для написания программ на Python, которые конечные пользователи могут легко настраивать.

> **Примечание**
>
> Эта библиотека *не* интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI из реестра Windows.

> **См. также**
>
> **Модуль [`shlex`](https://python-all.ru/3.3/library/shlex.html#module-shlex)**
>
> Поддержка создания мини-языков в стиле оболочки Unix, которые можно использовать в качестве альтернативного формата для файлов конфигурации приложений.
>
> **Модуль [`json`](https://python-all.ru/3.3/library/json.html#module-json)**
>
> Модуль json реализует подмножество синтаксиса JavaScript, которое также можно использовать для этой цели.

## 14.2.1. Быстрый старт

Рассмотрим простейший конфигурационный файл, который выглядит так:

```ini
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no
```

Структура INI-файлов описана [в следующем разделе](https://python-all.ru/3.3/library/configparser.html#supported-ini-file-structure). По сути, файл состоит из разделов, каждый из которых содержит ключи со значениями. Классы [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) могут читать и записывать такие файлы. Начнём с программного создания приведённого выше конфигурационного файла.

```python
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = {'ServerAliveInterval': '45',
...                      'Compression': 'yes',
...                      'CompressionLevel': '9'}
>>> config['bitbucket.org'] = {}
>>> config['bitbucket.org']['User'] = 'hg'
>>> config['topsecret.server.com'] = {}
>>> topsecret = config['topsecret.server.com']
>>> topsecret['Port'] = '50022'     # изменяет парсер
>>> topsecret['ForwardX11'] = 'no'  # то же самое
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
...   config.write(configfile)
...
```

Как видите, парсер конфигураций можно использовать почти как словарь. Есть различия, [описанные далее](https://python-all.ru/3.3/library/configparser.html#mapping-protocol-access), но поведение очень близко к тому, что можно ожидать от словаря.

Теперь, когда мы создали и сохранили конфигурационный файл, давайте прочитаем его и изучим содержащиеся в нем данные.

```python
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
>>> 'bitbucket.org' in config
True
>>> 'bytebong.com' in config
False
>>> config['bitbucket.org']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['bitbucket.org']: print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['bitbucket.org']['ForwardX11']
'yes'
```

Как видно выше, API довольно прост. Единственная магия заключается в разделе `DEFAULT`, который предоставляет значения по умолчанию для всех остальных разделов [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13). Также обратите внимание, что ключи в разделах нечувствительны к регистру и хранятся в нижнем регистре [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13).

## 14.2.2. Поддерживаемые типы данных

Парсеры конфигураций не угадывают типы данных значений в конфигурационных файлах, а всегда хранят их внутри как строки. Это означает, что если вам нужны другие типы данных, преобразование нужно выполнять самостоятельно:

```python
>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0
```

Однако извлечение логических значений не так просто. Передача значения в `bool()` не поможет, так как `bool('False')` всё равно равно `True`. Поэтому парсеры конфигурации также предоставляют `getboolean()`. Этот метод нечувствителен к регистру и распознаёт логические значения из `'yes'`/`'no'`, `'on'`/`'off'` и `'1'`/`'0'` [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13). Например:

```python
>>> topsecret.getboolean('ForwardX11')
False
>>> config['bitbucket.org'].getboolean('ForwardX11')
True
>>> config.getboolean('bitbucket.org', 'Compression')
True
```

Помимо `getboolean()`, парсеры конфигурации также предоставляют аналогичные методы `getint()` и `getfloat()`, но они гораздо менее полезны, поскольку для этих типов достаточно преобразования с помощью [`int()`](https://python-all.ru/3.3/library/functions.html#int) и [`float()`](https://python-all.ru/3.3/library/functions.html#float).

## 14.2.3. Значения по умолчанию

Как и со словарём, можно использовать метод `get()` раздела для предоставления запасных значений:

```python
>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'
```

Обратите внимание, что значения по умолчанию имеют приоритет над запасными значениями. Например, в нашем примере ключ `'CompressionLevel'` был указан только в разделе `'DEFAULT'`. Если мы попытаемся получить его из раздела `'topsecret.server.com'`, мы всегда получим значение по умолчанию, даже если укажем запасное:

```python
>>> topsecret.get('CompressionLevel', '3')
'9'
```

Следует также знать, что метод `get()` на уровне парсера предоставляет пользовательский, более сложный интерфейс, сохраняемый для обратной совместимости. При использовании этого метода запасное значение можно передать через именованный аргумент `fallback`:

```python
>>> config.get('bitbucket.org', 'monster',
...            fallback='No such things as monsters')
'No such things as monsters'
```

Тот же аргумент `fallback` можно использовать с методами `getint()`, `getfloat()` и `getboolean()`, например:

```python
>>> 'BatchMode' in topsecret
False
>>> topsecret.getboolean('BatchMode', fallback=True)
True
>>> config['DEFAULT']['BatchMode'] = 'no'
>>> topsecret.getboolean('BatchMode', fallback=True)
False
```

## 14.2.4. Поддерживаемая структура INI-файлов

Файл конфигурации состоит из разделов, каждый из которых начинается с заголовка `[section]`, за которым следуют записи ключ/значение, разделённые определённой строкой (по умолчанию `=` или `:` [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13)). По умолчанию имена разделов чувствительны к регистру, а ключи – нет [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13). Начальные и конечные пробелы удаляются из ключей и значений. Значения могут отсутствовать, и в этом случае разделитель ключ/значение также может быть опущен. Значения также могут занимать несколько строк, если они имеют отступ глубже, чем первая строка значения. В зависимости от режима парсера пустые строки могут рассматриваться как части многострочных значений или игнорироваться.

Конфигурационные файлы могут содержать комментарии, начинающиеся с определенных символов (по умолчанию `#` и `;` [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13)). Комментарии могут располагаться на отдельной пустой строке, возможно с отступом. [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13)

Например:

```ini
[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values

[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true

[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
    I sleep all night and I work all day

[No Values]
key_without_value
empty string value here =

[You can use comments]
# like this
; or this

# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.

    [Sections Can Be Indented]
        can_values_be_as_well = True
        does_that_mean_anything_special = False
        purpose = formatting for readability
        multiline_values = are
            handled just fine as
            long as they are indented
            deeper than the first line
            of a value
        # Did I mention we can indent comments, too?
```

## 14.2.5. Интерполяция значений

В дополнение к основной функциональности [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser) поддерживает интерполяцию. Это означает, что значения могут быть предварительно обработаны перед возвратом из вызовов `get()`.

#### `class configparser.BasicInterpolation`

Реализация по умолчанию, используемая [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser). Она позволяет значениям содержать строки формата, которые ссылаются на другие значения в том же разделе или значения в специальном разделе по умолчанию [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13). Дополнительные значения по умолчанию могут быть предоставлены при инициализации.

Например:

```ini
[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures
```

В приведённом выше примере [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser) с *interpolation*, установленным в `BasicInterpolation()`, разрешит `%(home_dir)s` в значение `home_dir` (в данном случае `/Users`). `%(my_dir)s` в итоге будет разрешено в `/Users/lumberjack`. Все интерполяции выполняются по требованию, поэтому ключи, используемые в цепочке ссылок, не обязательно должны быть указаны в каком-либо определённом порядке в файле конфигурации.

При `interpolation`, установленном в `None`, парсер просто вернёт `%(my_dir)s/Pictures` в качестве значения `my_pictures` и `%(home_dir)s/lumberjack` в качестве значения `my_dir`.

#### `class configparser.ExtendedInterpolation`

Альтернативный обработчик интерполяции, реализующий более продвинутый синтаксис, используемый, например, в `zc.buildout`. Расширенная интерполяция использует `${section:option}` для обозначения значения из другого раздела. Интерполяция может распространяться на несколько уровней. Для удобства, если часть `section:` опущена, интерполяция по умолчанию применяется к текущему разделу (и, возможно, к значениям по умолчанию из специального раздела).

Например, конфигурация, заданная выше с базовой интерполяцией, с расширенной интерполяцией будет выглядеть так:

```ini
[Paths]
home_dir: /Users
my_dir: ${home_dir}/lumberjack
my_pictures: ${my_dir}/Pictures
```

Значения из других разделов также можно получать:

```ini
[Common]
home_dir: /Users
library_dir: /Library
system_dir: /System
macports_dir: /opt/local

[Frameworks]
Python: 3.2
path: ${Common:system_dir}/Library/Frameworks/

[Arthur]
nickname: Two Sheds
last_name: Jackson
my_dir: ${Common:home_dir}/twosheds
my_pictures: ${my_dir}/Pictures
python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
```

## 14.2.6. Доступ через протокол отображения

Новое в версии 3.2.

Доступ через протокол отображения – это общее название функциональности, позволяющей использовать пользовательские объекты как словари. В случае [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) реализация интерфейса отображения использует нотацию `parser['section']['option']`.

`parser['section']` в частности возвращает прокси для данных раздела в парсере. Это означает, что значения не копируются, а берутся из исходного парсера по запросу. Что ещё более важно, при изменении значений на прокси раздела они фактически изменяются в исходном парсере.

Объекты [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) ведут себя настолько близко к реальным словарям, насколько это возможно. Интерфейс отображения полный и соответствует абстрактному базовому классу [`MutableMapping`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MutableMapping). Однако есть несколько различий, которые следует учитывать:

- По умолчанию все ключи в разделах доступны без учёта регистра [\[1\]](https://python-all.ru/3.3/library/configparser.html#id13). Например, `for option in parser["section"]` возвращает только `optionxform`-имена ключей опций. Это означает ключи в нижнем регистре по умолчанию. В то же время для раздела, содержащего ключ `'a'`, оба выражения возвращают `True`:

  ```python
  "a" in parser["section"]
  "A" in parser["section"]
  ```
- Все секции также включают значения `DEFAULTSECT`, что означает, что `.clear()` для секции может не сделать секцию явно пустой. Это потому, что значения по умолчанию нельзя удалить из секции (технически их там нет). Если они были переопределены в секции, удаление приводит к тому, что значение по умолчанию снова становится видимым. Попытка удалить значение по умолчанию приводит к `KeyError`.
- `DEFAULTSECT` не может быть удалён из парсера:

  - попытка удалить его вызывает `ValueError`,
  - `parser.clear()` оставляет его нетронутым,
  - `parser.popitem()` никогда не возвращает его.
- `parser.get(section, option, **kwargs)` – второй аргумент **не является** запасным значением. Однако обратите внимание, что методы `get()` на уровне раздела совместимы как с протоколом отображения, так и с классическим API configparser.
- `parser.items()` совместим с протоколом отображения (возвращает список пар *имя\_раздела*, *proxy\_раздела*, включая DEFAULTSECT). Однако этот метод также можно вызывать с аргументами: `parser.items(section, raw, vars)`. Второй вызов возвращает список пар *опция*, *значение* для указанного `раздела`, со всеми развёрнутыми подстановками (если не передан `raw=True`).

Протокол отображения реализован поверх существующего устаревшего API, поэтому подклассы, переопределяющие исходный интерфейс, по-прежнему должны работать с отображением, как и ожидается.

## 14.2.7. Настройка поведения парсера

Существует почти столько же вариантов INI-формата, сколько приложений, использующих его. [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) прилагает большие усилия для поддержки максимально разумного набора доступных стилей INI. Функциональность по умолчанию в основном обусловлена историческими причинами, и, скорее всего, потребуется настроить некоторые её возможности.

Самый распространённый способ изменить поведение конкретного анализатора конфигов – использовать параметры [`__init__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__init__):

- *defaults*, значение по умолчанию: `None`

  Этот параметр принимает словарь пар ключ-значение, который изначально помещается в раздел `DEFAULT`. Это изящный способ поддержки лаконичных файлов конфигурации, в которых не указываются значения, совпадающие с документированными по умолчанию.

  Подсказка: если нужно указать значения по умолчанию для конкретного раздела, используйте `read_dict()` перед чтением самого файла.
- *dict\_type*, значение по умолчанию: [`collections.OrderedDict`](https://python-all.ru/3.3/library/collections.html#collections.OrderedDict)

  Эта опция существенно влияет на то, как будет вести себя протокол отображения и как выглядят записанные файлы конфигурации. При использовании упорядоченного словаря по умолчанию каждый раздел хранится в порядке добавления в анализатор. То же самое относится и к опциям внутри разделов.

  Альтернативный тип словаря можно использовать, например, для сортировки разделов и опций при обратной записи. Также можно использовать обычный словарь по соображениям производительности.

  Обратите внимание: существует несколько способов добавления набора пар ключ-значение за одну операцию. Если в таких операциях используется обычный словарь, порядок ключей может быть случайным. Например:

  ```python
  >>> parser = configparser.ConfigParser()
  >>> parser.read_dict({'section1': {'key1': 'value1',
  ...                                'key2': 'value2',
  ...                                'key3': 'value3'},
  ...                   'section2': {'keyA': 'valueA',
  ...                                'keyB': 'valueB',
  ...                                'keyC': 'valueC'},
  ...                   'section3': {'foo': 'x',
  ...                                'bar': 'y',
  ...                                'baz': 'z'}
  ... })
  >>> parser.sections()
  ['section3', 'section2', 'section1']
  >>> [option for option in parser['section3']]
  ['baz', 'foo', 'bar']
  ```

  В таких операциях также необходимо использовать упорядоченный словарь:

  ```python
  >>> from collections import OrderedDict
  >>> parser = configparser.ConfigParser()
  >>> parser.read_dict(
  ...   OrderedDict((
  ...     ('s1',
  ...      OrderedDict((
  ...        ('1', '2'),
  ...        ('3', '4'),
  ...        ('5', '6'),
  ...      ))
  ...     ),
  ...     ('s2',
  ...      OrderedDict((
  ...        ('a', 'b'),
  ...        ('c', 'd'),
  ...        ('e', 'f'),
  ...      ))
  ...     ),
  ...   ))
  ... )
  >>> parser.sections()
  ['s1', 's2']
  >>> [option for option in parser['s1']]
  ['1', '3', '5']
  >>> [option for option in parser['s2'].values()]
  ['b', 'd', 'f']
  ```
- *allow\_no\_value*, значение по умолчанию: `False`

  Некоторые файлы конфигурации содержат настройки без значений, но в остальном соответствуют синтаксису, поддерживаемому [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser). Параметр *allow\_no\_value* конструктора можно использовать, чтобы указать, что такие значения следует принимать:

  ```python
  >>> import configparser

  >>> sample_config = """
  ... [mysqld]
  ...   user = mysql
  ...   pid-file = /var/run/mysqld/mysqld.pid
  ...   skip-external-locking
  ...   old_passwords = 1
  ...   skip-bdb
  ...   # we don't need ACID today
  ...   skip-innodb
  ... """
  >>> config = configparser.ConfigParser(allow_no_value=True)
  >>> config.read_string(sample_config)

  >>> # Настройки со значениями обрабатываются как и раньше:
  >>> config["mysqld"]["user"]
  'mysql'

  >>> # Настройки без значений дают None:
  >>> config["mysqld"]["skip-bdb"]

  >>> # Настройки, которые не указаны, по-прежнему вызывают ошибку:
  >>> config["mysqld"]["does-not-exist"]
  Traceback (most recent call last):
    ...
  KeyError: 'does-not-exist'
  ```
- *delimiters*, значение по умолчанию: `('=', ':')`

  Разделители – это подстроки, которые отделяют ключи от значений внутри раздела. Первое вхождение подстроки-разделителя в строке считается разделителем. Это означает, что значения (но не ключи) могут содержать разделители.

  См. также аргумент *space\_around\_delimiters* функции [`ConfigParser.write()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.write).
- *comment\_prefixes*, значение по умолчанию: `('#', ';')`
- *inline\_comment\_prefixes*, значение по умолчанию: `None`

  Префиксы комментариев – это строки, указывающие на начало допустимого комментария в файле конфигурации. *comment\_prefixes* используются только на пустых строках (возможно с отступом), тогда как *inline\_comment\_prefixes* могут использоваться после любого допустимого значения (например, названий разделов, опций и пустых строк). По умолчанию встроенные комментарии отключены, а в качестве префиксов для комментариев на всю строку используются `'#'` и `';'`.

  Изменено в версии 3.2: В предыдущих версиях [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) поведение соответствовало `comment_prefixes=('#',';')` и `inline_comment_prefixes=(';',)`.

  Обратите внимание: анализаторы конфигов не поддерживают экранирование префиксов комментариев, поэтому использование *inline\_comment\_prefixes* может помешать пользователям указывать значения опций, содержащие символы, используемые как префиксы комментариев. При сомнениях избегайте установки *inline\_comment\_prefixes*. В любом случае, единственный способ сохранить символы префиксов комментариев в начале строки в многострочных значениях – это подстановка префикса, например:

  ```python
  >>> from configparser import ConfigParser, ExtendedInterpolation
  >>> parser = ConfigParser(interpolation=ExtendedInterpolation())
  >>> # можно также использовать стандартный BasicInterpolation
  >>> parser.read_string("""
  ... [DEFAULT]
  ... hash = #
  ...
  ... [hashes]
  ... shebang =
  ...   ${hash}!/usr/bin/env python
  ...   ${hash} -*- coding: utf-8 -*-
  ...
  ... extensions =
  ...   enabled_extension
  ...   another_extension
  ...   #disabled_by_comment
  ...   yet_another_extension
  ...
  ... interpolation not necessary = if # is not at line start
  ... even in multiline values = line #1
  ...   line #2
  ...   line #3
  ... """)
  >>> print(parser['hashes']['shebang'])

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  >>> print(parser['hashes']['extensions'])

  enabled_extension
  another_extension
  yet_another_extension
  >>> print(parser['hashes']['interpolation not necessary'])
  if # is not at line start
  >>> print(parser['hashes']['even in multiline values'])
  line #1
  line #2
  line #3
  ```
- *strict*, значение по умолчанию: `True`

  Если установлено значение `True`, анализатор не допускает дублирования разделов или опций при чтении из одного источника (с помощью `read_file()`, `read_string()` или `read_dict()`). В новых приложениях рекомендуется использовать строгие анализаторы.

  Изменено в версии 3.2: В предыдущих версиях [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) поведение соответствовало `strict=False`.
- *empty\_lines\_in\_values*, значение по умолчанию: `True`

  В парсерах конфигурации значения могут занимать несколько строк, если их отступ больше, чем у ключа, к которому они относятся. По умолчанию парсеры также допускают, чтобы пустые строки были частью значений. В то же время сами ключи могут иметь произвольный отступ для улучшения читаемости. В результате, когда конфигурационные файлы становятся большими и сложными, пользователю легко потерять представление о структуре файла. Рассмотрим пример:

  ```ini
  [Section]
  key = multiline
    value with a gotcha

   this = is still a part of the multiline value of 'key'
  ```

  Это может быть особенно проблематично для пользователя, если он использует пропорциональный шрифт для редактирования файла. Поэтому, если вашему приложению не требуются значения с пустыми строками, стоит запретить их. Это заставит пустые строки каждый раз разделять ключи. В приведённом выше примере получилось бы два ключа: `key` и `this`.
- *default\_section*, значение по умолчанию: `configparser.DEFAULTSECT` (то есть `"DEFAULT"`)

  Соглашение о выделении специального раздела со значениями по умолчанию для других разделов или для целей интерполяции – это мощная концепция данной библиотеки, позволяющая создавать сложные декларативные конфигурации. Обычно этот раздел называется `"DEFAULT"`, но его можно настроить на любое другое допустимое имя раздела. Некоторые типичные значения: `"general"` или `"common"`. Указанное имя используется для распознавания разделов по умолчанию при чтении из любого источника, а также при записи конфигурации обратно в файл. Текущее значение можно получить с помощью атрибута `parser_instance.default_section` и изменить во время выполнения (например, для преобразования файлов из одного формата в другой).
- *interpolation*, значение по умолчанию: `configparser.BasicInterpolation`

  Поведение интерполяции можно настроить, передав собственный обработчик через аргумент *interpolation*. Значение `None` можно использовать для полного отключения интерполяции, `ExtendedInterpolation()` предоставляет более продвинутый вариант, вдохновлённый `zc.buildout`. Подробнее об этом в [специальном разделе документации](https://python-all.ru/3.3/library/configparser.html#interpolation-of-values). [`RawConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.RawConfigParser) имеет значение по умолчанию `None`.

Более продвинутая настройка может быть выполнена путём переопределения значений по умолчанию этих атрибутов парсера. Значения по умолчанию определены в классах, поэтому их можно переопределить в подклассах или путём присваивания атрибутов.

#### `configparser.BOOLEAN_STATES`

По умолчанию при использовании `getboolean()` анализаторы конфигов считают следующие значения `True`: `'1'`, `'yes'`, `'true'`, `'on'`, а следующие значения `False`: `'0'`, `'no'`, `'false'`, `'off'`. Можно переопределить это, указав собственный словарь строк и их булевых значений. Например:

```python
>>> custom = configparser.ConfigParser()
>>> custom['section1'] = {'funky': 'nope'}
>>> custom['section1'].getboolean('funky')
Traceback (most recent call last):
...
ValueError: Not a boolean: nope
>>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}
>>> custom['section1'].getboolean('funky')
False
```

Другие типичные булевы пары включают `accept`/`reject` или `enabled`/`disabled`.

#### `configparser.optionxform(option)`

Этот метод преобразует имена параметров при каждой операции чтения, получения или установки. По умолчанию он приводит имя к нижнему регистру. Это также означает, что при записи конфигурационного файла все ключи будут в нижнем регистре. Переопределите этот метод, если такое поведение не подходит. Например:

```python
>>> config = """
... [Section1]
... Key = Value
...
... [Section2]
... AnotherKey = Value
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> list(typical['Section1'].keys())
['key']
>>> list(typical['Section2'].keys())
['anotherkey']
>>> custom = configparser.RawConfigParser()
>>> custom.optionxform = lambda option: option
>>> custom.read_string(config)
>>> list(custom['Section1'].keys())
['Key']
>>> list(custom['Section2'].keys())
['AnotherKey']
```

#### `configparser.SECTCRE`

Скомпилированное регулярное выражение для разбора заголовков разделов. По умолчанию соответствует `[section]` имени `"section"`. Пробелы считаются частью имени раздела, поэтому `[ larch ]` будет прочитан как раздел с именем `" larch "`. Переопределите этот атрибут, если это не подходит. Например:

```python
>>> config = """
... [Section 1]
... option = value
...
... [  Section 2  ]
... another = val
... """
>>> typical = ConfigParser()
>>> typical.read_string(config)
>>> typical.sections()
['Section 1', '  Section 2  ']
>>> custom = ConfigParser()
>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")
>>> custom.read_string(config)
>>> custom.sections()
['Section 1', 'Section 2']
```

> **Примечание**
>
> Хотя объекты ConfigParser также используют атрибут `OPTCRE` для распознавания строк опций, переопределять его не рекомендуется, так как это будет мешать параметрам конструктора *allow\_no\_value* и *delimiters*.

## 14.2.8. Примеры устаревшего API

В основном из соображений обратной совместимости [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser) также предоставляет устаревший API с явными методами `get`/`set`. Хотя для описанных ниже методов есть обоснованные случаи использования, для новых проектов предпочтительнее доступ через протокол отображения. Устаревший API временами более продвинутый, низкоуровневый и откровенно неинтуитивный.

Пример записи в файл конфигурации:

```python
import configparser

config = configparser.RawConfigParser()

# Обратите внимание: используя функции set класса RawConfigParser, можно присваивать
# ключам внутренние значения, не являющиеся строками, но при попытке
# записи в файл или при получении значения в не-сыром режиме возникнет ошибка. Присваивание
# значений через протокол отображения или ConfigParser.set() не допускает
# выполнения таких присваиваний.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# Записываем наш конфигурационный файл в 'example.cfg'
with open('example.cfg', 'w') as configfile:
    config.write(configfile)
```

Пример повторного чтения файла конфигурации:

```python
import configparser

config = configparser.RawConfigParser()
config.read('example.cfg')

# getfloat() вызывает исключение, если значение не является float.
# getint() и getboolean() делают то же самое для своих типов.
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print(a_float + an_int)

# Обратите внимание, что следующий вывод не интерполирует '%(bar)s' или '%(baz)s'.
# Это потому, что мы используем RawConfigParser().
if config.getboolean('Section1', 'a_bool'):
    print(config.get('Section1', 'foo'))
```

Чтобы получить интерполяцию, используйте [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser):

```python
import configparser

cfg = configparser.ConfigParser()
cfg.read('example.cfg')

# Установите необязательный аргумент *raw* метода get() в True, если требуется отключить
# интерполяцию в одной операции get.
print(cfg.get('Section1', 'foo', raw=False)) # -> "Python – это весело!"
print(cfg.get('Section1', 'foo', raw=True))  # -> "%(bar)s – это %(baz)s!"

# Необязательный аргумент *vars* – это словарь с элементами, которые будут иметь
# приоритет при интерполяции.
print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',
                                          'baz': 'evil'}))

# Необязательный аргумент *fallback* можно использовать для предоставления запасного значения
print(cfg.get('Section1', 'foo'))
      # -> "Python – это весело!"

print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
      # -> "Python – это весело!"

print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
      # -> "Монстров не существует."

# Голый вызов print(cfg.get('Section1', 'monster')) вызовет NoOptionError, но мы также можем использовать:
# но мы также можем использовать:

print(cfg.get('Section1', 'monster', fallback=None))
      # -> None
```

Значения по умолчанию доступны в обоих типах ConfigParsers. Они используются при интерполяции, если используемая опция не определена в другом месте.

```python
import configparser

# Новый экземпляр с 'bar' и 'baz', по умолчанию равными 'Life' и 'hard' соответственно.
config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})
config.read('example.cfg')

print(config.get('Section1', 'foo')) # -> "Python – это весело!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print(config.get('Section1', 'foo')) # -> "Жизнь тяжела!"
```

## 14.2.9. Объекты ConfigParser

#### `class configparser.ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation())`

Основной парсер конфигурации. Когда задан *defaults*, он инициализируется как словарь внутренних значений по умолчанию. Когда задан *dict\_type*, он будет использоваться для создания словарей для списка разделов, опций внутри раздела и значений по умолчанию.

Если указан *delimiters*, он используется как набор подстрок, разделяющих ключи и значения. Если указан *comment\_prefixes*, он будет использоваться как набор подстрок, обозначающих начало комментария в пустых строках. Комментарии могут быть с отступом. Если указан *inline\_comment\_prefixes*, он будет использоваться как набор подстрок, обозначающих начало комментария в непустых строках.

Если *strict* равен `True` (по умолчанию), синтаксический анализатор не допустит повторяющихся разделов или параметров при чтении из одного источника (файла, строки или словаря), вызывая [`DuplicateSectionError`](https://python-all.ru/3.3/library/configparser.html#configparser.DuplicateSectionError) или [`DuplicateOptionError`](https://python-all.ru/3.3/library/configparser.html#configparser.DuplicateOptionError). Если *empty\_lines\_in\_values* равен `False` (по умолчанию: `True`), каждая пустая строка означает конец параметра. В противном случае внутренние пустые строки многострочного параметра сохраняются как часть значения. Если *allow\_no\_value* равен `True` (по умолчанию: `False`), параметры без значений принимаются; значение для них равно `None`, и они сериализуются без завершающего разделителя.

Если указан *default\_section*, он задаёт имя для специального раздела, содержащего значения по умолчанию для других разделов и целей интерполяции (обычно называется `"DEFAULT"`). Это значение можно получить и изменить во время выполнения с помощью атрибута экземпляра `default_section`.

Поведение интерполяции можно настроить, предоставив пользовательский обработчик через аргумент *interpolation*. `None` можно использовать для полного отключения интерполяции, `ExtendedInterpolation()` предоставляет более продвинутый вариант, вдохновлённый `zc.buildout`. Подробнее об этом в [соответствующем разделе документации](https://python-all.ru/3.3/library/configparser.html#interpolation-of-values).

Все имена параметров, используемые в интерполяции, будут переданы через метод [`optionxform()`](https://python-all.ru/3.3/library/configparser.html#configparser.optionxform), как и любая другая ссылка на имя параметра. Например, при использовании стандартной реализации [`optionxform()`](https://python-all.ru/3.3/library/configparser.html#configparser.optionxform) (которая преобразует имена параметров в нижний регистр) значения `foo %(bar)s` и `foo %(BAR)s` эквивалентны.

Изменено в версии 3.1: Значение по умолчанию *dict\_type* – [`collections.OrderedDict`](https://python-all.ru/3.3/library/collections.html#collections.OrderedDict).

Изменено в версии 3.2: Были добавлены *allow\_no\_value*, *delimiters*, *comment\_prefixes*, *strict*, *empty\_lines\_in\_values*, *default\_section* и *interpolation*.

#### `defaults()`

Возвращает словарь, содержащий значения по умолчанию для экземпляра.

#### `sections()`

Возвращает список доступных разделов; *раздел по умолчанию* не включён в список.

#### `add_section(section)`

Добавляет раздел с именем *section* в экземпляр. Если раздел с таким именем уже существует, вызывается [`DuplicateSectionError`](https://python-all.ru/3.3/library/configparser.html#configparser.DuplicateSectionError). Если передано имя *раздела по умолчанию*, вызывается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError). Имя раздела должно быть строкой; в противном случае вызывается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).

Изменено в версии 3.2: Имена разделов, не являющиеся строками, вызывают [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).

#### `has_section(section)`

Указывает, присутствует ли в конфигурации указанный *раздел*. *Раздел по умолчанию* не учитывается.

#### `options(section)`

Возвращает список доступных параметров в указанном *разделе*.

#### `has_option(section, option)`

Если указанный *section* существует и содержит указанный *option*, возвращает [`True`](https://python-all.ru/3.3/library/constants.html#True); в противном случае возвращает [`False`](https://python-all.ru/3.3/library/constants.html#False). Если указанный *section* равен [`None`](https://python-all.ru/3.3/library/constants.html#None) или пустой строке, предполагается DEFAULT.

#### `read(filenames, encoding=None)`

Пытается прочитать и разобрать список имён файлов, возвращая список имён файлов, которые были успешно разобраны. Если *filenames* является строкой, она рассматривается как одно имя файла. Если файл, указанный в *filenames*, не может быть открыт, этот файл будет проигнорирован. Это сделано так, чтобы можно было указать список потенциальных мест расположения файлов конфигурации (например, текущий каталог, домашний каталог пользователя и какой-нибудь общесистемный каталог), и все существующие файлы конфигурации из списка будут прочитаны. Если ни один из указанных файлов не существует, экземпляр [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser) будет содержать пустой набор данных. Приложение, которое требует загрузки начальных значений из файла, должно загрузить необходимый файл или файлы с помощью [`read_file()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.read_file) перед вызовом [`read()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.read) для любых дополнительных файлов:

```python
import configparser, os

config = configparser.ConfigParser()
config.read_file(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],
            encoding='cp1250')
```

Новое в версии 3.2: Параметр *encoding*. Ранее все файлы читались с использованием кодировки по умолчанию для [`open()`](https://python-all.ru/3.3/library/functions.html#open).

#### `read_file(f, source=None)`

Читает и разбирает данные конфигурации из *f*, который должен быть итерируемым объектом, возвращающим строки Unicode (например, файлы, открытые в текстовом режиме).

Необязательный аргумент *source* указывает имя читаемого файла. Если он не задан и у *f* есть атрибут `name`, то он используется для *source*; по умолчанию – `'<???>'`.

Новое в версии 3.2: Заменяет [`readfp()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.readfp).

#### `read_string(string, source='<string>')`

Разбирает данные конфигурации из строки.

Необязательный аргумент *source* задаёт контекстно-зависимое имя переданной строки. Если он не указан, используется `'<string>'`. Обычно это должен быть путь файловой системы или URL.

Новое в версии 3.2.

#### `read_dict(dictionary, source='<dict>')`

Загружает конфигурацию из любого объекта, который предоставляет dict-подобный метод `items()`. Ключи – имена разделов, значения – словари с ключами и значениями, которые должны присутствовать в разделе. Если используемый тип словаря сохраняет порядок, разделы и их ключи будут добавлены по порядку. Значения автоматически преобразуются в строки.

Необязательный аргумент *source* задаёт контекстно-зависимое имя переданного словаря. Если не указан, используется `<dict>`.

Этот метод можно использовать для копирования состояния между парсерами.

Новое в версии 3.2.

#### `get(section, option, *, raw=False, vars=None[, fallback])`

Получает значение *option* для указанного *section*. Если передан *vars*, он должен быть словарём. Поиск *option* осуществляется в *vars* (если передан), *section* и *DEFAULTSECT* в указанном порядке. Если ключ не найден и передан *fallback*, он используется как запасное значение. В качестве значения *fallback* можно передать `None`.

Все операции `'%'` интерполяции раскрываются в возвращаемых значениях, если только аргумент *raw* не равен true. Значения для ключей интерполяции ищутся так же, как и параметр.

Изменено в версии 3.2: Аргументы *raw*, *vars* и *fallback* стали только ключевыми, чтобы защитить пользователей от попытки использовать третий аргумент в качестве запасного значения *fallback* (особенно при использовании протокола отображения).

#### `getint(section, option, *, raw=False, vars=None[, fallback])`

Удобный метод, который приводит *параметр* в указанном *разделе* к целому числу. См. [`get()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.

#### `getfloat(section, option, *, raw=False, vars=None[, fallback])`

Удобный метод, который приводит *параметр* в указанном *разделе* к числу с плавающей запятой. См. [`get()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.

#### `getboolean(section, option, *, raw=False, vars=None[, fallback])`

Удобный метод, который приводит *параметр* в указанном *разделе* к булевому значению. Обратите внимание, что допустимыми значениями для параметра являются `'1'`, `'yes'`, `'true'` и `'on'`, что заставляет этот метод возвращать `True`, а `'0'`, `'no'`, `'false'` и `'off'`, что заставляет его возвращать `False`. Эти строковые значения проверяются без учёта регистра. Любое другое значение приведёт к возбуждению [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError). См. [`get()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.

#### `items(raw=False, vars=None)`

#### `items(section, raw=False, vars=None)`

Если *section* не указан, возвращает список пар *section\_name*, *section\_proxy*, включая DEFAULTSECT.

В противном случае возвращает список пар *имя*, *значение* для параметров в указанном *разделе*. Необязательные аргументы имеют тот же смысл, что и для метода [`get()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.get).

Изменено в версии 3.2: Элементы, присутствующие в *vars*, больше не появляются в результате. Предыдущее поведение смешивало реальные параметры синтаксического анализатора с переменными, предоставленными для интерполяции.

#### `set(section, option, value)`

Если указанный раздел существует, устанавливает заданный параметр в указанное значение; в противном случае возбуждает [`NoSectionError`](https://python-all.ru/3.3/library/configparser.html#configparser.NoSectionError). *параметр* и *значение* должны быть строками; в противном случае возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).

#### `write(fileobject, space_around_delimiters=True)`

Записывает представление конфигурации в указанный [*файловый объект*](https://python-all.ru/3.3/glossary.html#term-file-object), который должен быть открыт в текстовом режиме (принимает строки). Это представление может быть проанализировано последующим вызовом [`read()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.read). Если *space\_around\_delimiters* равно true, разделители между ключами и значениями окружаются пробелами.

#### `remove_option(section, option)`

Удаляет указанный *параметр* из указанного *раздела*. Если раздел не существует, возбуждает [`NoSectionError`](https://python-all.ru/3.3/library/configparser.html#configparser.NoSectionError). Если параметр существовал и был удалён, возвращает [`True`](https://python-all.ru/3.3/library/constants.html#True); в противном случае возвращает [`False`](https://python-all.ru/3.3/library/constants.html#False).

#### `remove_section(section)`

Удаляет указанный *раздел* из конфигурации. Если раздел в действительности существовал, возвращает `True`. В противном случае возвращает `False`.

#### `optionxform(option)`

Преобразует имя параметра *option*, как оно найдено во входном файле или передано клиентским кодом, в форму, которая должна использоваться во внутренних структурах. Реализация по умолчанию возвращает версию *option* в нижнем регистре; подклассы могут переопределить это, или клиентский код может установить атрибут с таким именем на экземплярах, чтобы повлиять на это поведение.

Вам не нужно создавать подкласс синтаксического анализатора, чтобы использовать этот метод, вы также можете установить его на экземпляре как функцию, которая принимает строковый аргумент и возвращает строку. Установка его в `str`, например, сделает имена параметров чувствительными к регистру:

```python
cfgparser = ConfigParser()
cfgparser.optionxform = str
```

Обратите внимание, что при чтении файлов конфигурации пробелы вокруг имён параметров удаляются до вызова [`optionxform()`](https://python-all.ru/3.3/library/configparser.html#configparser.optionxform).

#### `readfp(fp, filename=None)`

Устарело с версии 3.2: Используйте [`read_file()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.read_file) вместо этого.

Изменено в версии 3.2: [`readfp()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.readfp) теперь выполняет итерацию по *f* вместо вызова `f.readline()`.

Для существующего кода, вызывающего [`readfp()`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser.readfp) с аргументами, которые не поддерживают итерацию, может быть использован следующий генератор в качестве обёртки вокруг файлоподобного объекта:

```python
def readline_generator(f):
    line = f.readline()
    while line:
        yield line
        line = f.readline()
```

Вместо `parser.readfp(f)` используйте `parser.read_file(readline_generator(f))`.

#### `configparser.MAX_INTERPOLATION_DEPTH`

Максимальная глубина рекурсивной интерполяции для `get()`, когда параметр *raw* имеет значение false. Это актуально только при использовании интерполяции по умолчанию *interpolation*.

## 14.2.10. Объекты RawConfigParser

#### `class configparser.RawConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT[, interpolation])`

Устаревший вариант [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser) с отключённой по умолчанию интерполяцией и небезопасными методами `add_section` и `set`.

> **Примечание**
>
> Рекомендуется использовать [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser), который проверяет типы значений при внутреннем хранении. Если интерполяция не нужна, можно использовать `ConfigParser(interpolation=None)`.

#### `add_section(section)`

Добавляет раздел с именем *раздел* в экземпляр. Если раздел с указанным именем уже существует, возбуждается [`DuplicateSectionError`](https://python-all.ru/3.3/library/configparser.html#configparser.DuplicateSectionError). Если передано имя *раздел по умолчанию*, возбуждается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).

Тип *раздела* не проверяется, что позволяет пользователям создавать нестроковые именованные разделы. Такое поведение не поддерживается и может вызывать внутренние ошибки.

#### `set(section, option, value)`

Если указанный раздел существует, устанавливает заданную опцию в указанное значение; в противном случае возбуждает [`NoSectionError`](https://python-all.ru/3.3/library/configparser.html#configparser.NoSectionError). Хотя можно использовать [`RawConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.RawConfigParser) (или [`ConfigParser`](https://python-all.ru/3.3/library/configparser.html#configparser.ConfigParser) с параметром *raw*, установленным в true) для *внутреннего* хранения нестроковых значений, полная функциональность (включая интерполяцию и вывод в файлы) может быть достигнута только с использованием строковых значений.

Этот метод позволяет пользователям присваивать нестроковые значения ключам внутри. Такое поведение не поддерживается и приведет к ошибкам при попытке записи в файл или получении значения в несыром режиме. **Используйте API протокола отображения**, который не допускает таких присваиваний.

## 14.2.11. Исключения

#### `exception configparser.Error`

Базовый класс для всех остальных исключений [`configparser`](https://python-all.ru/3.3/library/configparser.html#module-configparser).

#### `exception configparser.NoSectionError`

Исключение, возбуждаемое, когда указанный раздел не найден.

#### `exception configparser.DuplicateSectionError`

Исключение возбуждается, если `add_section()` вызывается с именем раздела, который уже существует, или в строгих анализаторах, когда раздел встречается более одного раза в одном входном файле, строке или словаре.

Новое в версии 3.2: Добавлены необязательные атрибуты `source` и `lineno` и аргументы для [`__init__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__init__).

#### `exception configparser.DuplicateOptionError`

Исключение, возбуждаемое строгими парсерами, если один параметр встречается дважды при чтении из одного файла, строки или словаря. Это позволяет отлавливать опечатки и ошибки, связанные с регистром символов: например, в словаре может быть два ключа, представляющих один и тот же конфигурационный ключ, регистр которого не учитывается.

#### `exception configparser.NoOptionError`

Исключение, возбуждаемое, когда указанный параметр не найден в указанном разделе.

#### `exception configparser.InterpolationError`

Базовый класс для исключений, возбуждаемых при возникновении проблем во время выполнения строковой интерполяции.

#### `exception configparser.InterpolationDepthError`

Исключение возбуждается, когда строковая интерполяция не может быть завершена, поскольку количество итераций превышает [`MAX_INTERPOLATION_DEPTH`](https://python-all.ru/3.3/library/configparser.html#configparser.MAX_INTERPOLATION_DEPTH). Подкласс [`InterpolationError`](https://python-all.ru/3.3/library/configparser.html#configparser.InterpolationError).

#### `exception configparser.InterpolationMissingOptionError`

Исключение возбуждается, когда опция, на которую ссылается значение, не существует. Подкласс [`InterpolationError`](https://python-all.ru/3.3/library/configparser.html#configparser.InterpolationError).

#### `exception configparser.InterpolationSyntaxError`

Исключение возбуждается, когда исходный текст, в который вносятся подстановки, не соответствует требуемому синтаксису. Подкласс [`InterpolationError`](https://python-all.ru/3.3/library/configparser.html#configparser.InterpolationError).

#### `exception configparser.MissingSectionHeaderError`

Исключение, возбуждаемое при попытке разобрать файл, не содержащий заголовков разделов.

#### `exception configparser.ParsingError`

Исключение, возникающее при ошибках во время разбора файла.

Изменено в версии 3.2: Атрибут `filename` и аргумент [`__init__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__init__) были переименованы в `source` для согласованности.

Сноски

| \[1\] | *([1](https://python-all.ru/3.3/library/configparser.html#id1), [2](https://python-all.ru/3.3/library/configparser.html#id2), [3](https://python-all.ru/3.3/library/configparser.html#id3), [4](https://python-all.ru/3.3/library/configparser.html#id4), [5](https://python-all.ru/3.3/library/configparser.html#id5), [6](https://python-all.ru/3.3/library/configparser.html#id6), [7](https://python-all.ru/3.3/library/configparser.html#id7), [8](https://python-all.ru/3.3/library/configparser.html#id8), [9](https://python-all.ru/3.3/library/configparser.html#id9))* Парсеры конфигурационных файлов допускают широкую настройку. Если вам интересно изменить поведение, описанное в сноске, обратитесь к разделу [Настройка поведения парсера](https://python-all.ru/3.3/library/configparser.html#customizing-parser-behaviour). |
| --- | --- |
