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.