Помогите обработать ошибку
Существует код:
litle = 1
a = 'One'
if litle==1:
litle-=1
with open('shot_001.txt','r', encoding = 'utf-8') as f:
fr = list(f)
print(fr)
if fr.index('\ufeff' +a + '\n') == 0:
print('Это первый индекс')
else:
print('Первый индекс')
Его задача это вывод сообщения, если в текстовом файле в котором находятся данные типа:
One
1
Two
2
Стоит отметить что 'One' и 'Two' могут меняться.
Если 'One' находится на первой строчке, то выводится одно сообщение, но он так же может находиться на третьей и тогда выводится другое сообщение. Но когда a меняется на Two, то выдается ошибка:
if fr.index('\ufeff' +a + '\n') == 0: ValueError: '\ufeffTwo\n' is not in list
Прошу помощи, что бы обработать или же убрать это ошибку. Спасибо.
Ответы (2 шт):
Ваш файл очевидно записан в формате с так называемым маркером последовательности байтов (Byte Order Mark- BOM). Согласно спецификации Юникода, маркер может стоять только в самом начале файла или потока, т.е. практически не влияет на содержимое файла, а служит лишь своеобразным указателем на то, что файле закодирован в Юникоде. Использование этого символа, согласно спецификации Юникод, не является обязательным, тем не менее его достаточно часто используется. В том-же Notepad можно прочесть и легко перекодировать файл в этих вариантах кодировках.
Для чтения таких файлов в параметрах необходимо указывать параметр encoding = 'utf-8-sig'
Ваш файл во внутри такой:
\ufeffOne
1
Two
2
где последовательность двух байтов\ufeff так называемый «BOM».
(Между прочим, мне кажется, что код этой — принципиально неправильной — программы назначен для работы с файлом в кодировке UTF-16.)
Значит, полученный из него список fr будет ["\ufeffOne\n", "1\n", "Two\n", "2\n"].
Теперь получена вами ошибка очевидна:
"\ufeffOne\n"находится в спискеfr(случай дляa = 'One') — нет ошибки, но"\ufeffTwo\n"не находится в спискеfr(случай дляa = 'Two') — ошибкаif fr.index('\ufeff' +a + '\n') == 0: ValueError: '\ufeffTwo\n' is not in list(на русском: «Ошибка значения:
'\ufeffTwo\n'не находится в списке»)