2025, Oct 17 00:16

Почему возникает configparser.NoSectionError и как его исправить

Почему возникает configparser.NoSectionError при работе с INI в Python: причина не в WindowsPath, а в отсутствии раздела. Пример и корректное решение с Path.

При переходе от строковых путей к pathlib.Path легко наткнуться на configparser.NoSectionError и поспешно решить, что дело в обратных слешах Windows. Это не так. Исключение означает, что вы читаете или записываете раздел, которого ещё нет в конфигурации.

Суть проблемы

Вы читаете и записываете INI-файл через ConfigParser. Раньше пути хранились как str, затем вы перешли на Path из pathlib. И внезапно появляется configparser.NoSectionError: No section:. По хронологии кажется, что виноват WindowsPath, но причина в другом.

Минимальный пример, воспроизводящий ошибку

from configparser import ConfigParser as IniCfg
from pathlib import Path as FsPath

ini = IniCfg()

# Раздел ещё не создан.
# Следующая строка вызовет configparser.NoSectionError
ini.set('Paths', 'file', str(FsPath(r'C:\Users\Example\File.txt')))

with open('config.ini', 'w') as out_fh:
    ini.write(out_fh)

Что на самом деле происходит

configparser.NoSectionError возникает, когда set() или get() обращаются к несуществующему разделу. Причина не в WindowsPath и не в обратных слешах в строке пути. Исключение лишь сообщает, что нужный раздел ещё не добавлен в конфигурацию.

Решение

Создайте раздел перед вызовом set() или get(); записывайте в файл строковое представление Path и при чтении восстанавливайте объект Path.

from configparser import ConfigParser as IniCfg
from pathlib import Path as FsPath

ini = IniCfg()
ini.add_section('Paths')

ini.set('Paths', 'file', str(FsPath(r'C:\Users\Example\File.txt')))

with open('config.ini', 'w') as out_fh:
    ini.write(out_fh)

ini.read('config.ini')
path_obj = FsPath(ini.get('Paths', 'file'))

Почему это важно

Неверная диагностика причины configparser.NoSectionError заставляет искать проблему не там. С обработкой путей в Windows здесь всё в порядке; сбой связан с отсутствующей структурой конфигурации. Если некоторые категории или разделы необязательны и могут отсутствовать в зависимости от выбора пользователя, такое исключение — ожидаемое поведение при попытке работать с несуществующим разделом.

Итоги

Перед вызовом set() или get() убедитесь, что раздел существует. Сохраняйте пути как str(path_obj), а при чтении восстанавливайте их через Path(...). Понимание того, что NoSectionError указывает на отсутствие раздела, а не на проблему с форматированием пути, делает работу с конфигурацией предсказуемой и избавляет от ложных тревог при использовании путей Windows.

Статья основана на вопросе на StackOverflow от AlMa и ответе от Abuzar Mughal.