Ошибка при попытке получить данные из файла .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 шт):
Краткий ответ
Укажите кодировку, в которой следует прочитать файл
config.read(directory, encoding="utf-8")
Развернутый ответ
Предисловие
Сделал следующие выводы на основе предоставленной Вами трассировки (Traceback):
- Операционная система: Windows
- 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 по умолчанию. Вот и вся проблема!