Ошибка при попытке получить данные из файла .ini

Имеется следующий кусок кода:

        self.file_names = []
        self.directory_task_number = []

        config = ConfigParser()
        config.read(self.directory_task_number)

        # Переменные для определения типа загружаемых данных
        self.task1_type = config['task_text'].get('text')

        for file in os.listdir(self.directory_task):
            if file.endswith(".ini"):
                self.directory_task_number.append(os.path.join(self.directory_task, file))
                self.file_names.append(
                    (os.path.basename(os.path.join(self.directory_task, file)).split('.')[0]).split("_")[0])

        for i in range(0, len(self.file_names)):
            if self.file_names[i] == "1":
                pass

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

Traceback (most recent call last):
  File "G:/PyCharm/PyCharmProject/projectSAFTD_x32/OrbitTeacher/OrbitTeacherTaskL.py", line 322, in <module>
    w = MainWindow()
  File "G:/PyCharm/PyCharmProject/projectSAFTD_x32/OrbitTeacher/OrbitTeacherTaskL.py", line 26, in __init__
    self.setting()
  File "G:/PyCharm/PyCharmProject/projectSAFTD_x32/OrbitTeacher/OrbitTeacherTaskL.py", line 84, in setting
    self.task()
  File "G:/PyCharm/PyCharmProject/projectSAFTD_x32/OrbitTeacher/OrbitTeacherTaskL.py", line 94, in task
    self.task_planned()
  File "G:/PyCharm/PyCharmProject/projectSAFTD_x32/OrbitTeacher/OrbitTeacherTaskL.py", line 312, in task_planned
    self.task123_type = config['task_text'].get('text')
  File "G:\PyCharm\Python_x32\Python_3_8_10\lib\configparser.py", line 960, in __getitem__
    raise KeyError(key)
KeyError: 'task_text'

В списке программа получается значение директории для открытие нужного файла Файл конфигурации:

[task_text]
text = ЗАДАНИЕ

UPD: если упростить задачу и оставить только часть с файлом, то получается так:

# Поделючение библиотеки для работы файлов конфигурации
from configparser import ConfigParser

directory = "G:\PyCharm\PyCharmProject\projectSAFTD_x32\OrbitTeacher/task/first_test/1_123.ini"
config = ConfigParser()
config.read(directory)

number = config['task_text'].get('text')
print(number)

И ошибка изменится:

Traceback (most recent call last):
  File "G:/PyCharm/PyCharmProject/projectSAFTD_x32/Hi_Tech_2022_2/main3.py", line 9, in <module>
    config.read(directory)
  File "G:\PyCharm\Python_x32\Python_3_8_10\lib\configparser.py", line 697, in read
    self._read(fp, filename)
  File "G:\PyCharm\Python_x32\Python_3_8_10\lib\configparser.py", line 1017, in _read
    for lineno, line in enumerate(fp, start=1):
  File "G:\PyCharm\Python_x32\Python_3_8_10\lib\encodings\cp1251.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 33: character maps to <undefined>

Ответы (1 шт):

Автор решения: frrusi

Краткий ответ

Укажите кодировку, в которой следует прочитать файл

config.read(directory, encoding="utf-8")

Развернутый ответ

Предисловие

Сделал следующие выводы на основе предоставленной Вами трассировки (Traceback):

  1. Операционная система: Windows
  2. Python 3.8

Обоснование

Обратимся к исходному коду метода read модуля configparser, в котором обращаем внимание на аргумент по умолчанию encoding=None. Тут же замечаем открытие файла с передачей именованного аргумента encoding

Что происходит в Вашем случае?

config.read(directory)

В функцию open передается аргумент encoding со значением None, т. к. в методе read Вами он был опущен. Этот случай описывается в разделе Built-in Functions документации Python следующим образом:

In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding.

Т. е. Python неявно вызывает locale.getpreferredencoding() для получения кодировки. Что возвращает эта функция? Ответ ниже.

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

Посмотрим на результат функции в ОС Windows:

>>> import locale
>>> locale.getpreferredencoding()

'cp1251'

Из этого понятно, что Python пытался декодировать файл с помощью Windows-1251. "И что?" – спросите Вы. Загвоздка в том, что Python использует кодировку UTF-8 по умолчанию. Вот и вся проблема!

→ Ссылка