Помогите обработать ошибку

Существует код:

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 шт):

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

Ваш файл очевидно записан в формате с так называемым маркером последовательности байтов (Byte Order Mark- BOM). Согласно спецификации Юникода, маркер может стоять только в самом начале файла или потока, т.е. практически не влияет на содержимое файла, а служит лишь своеобразным указателем на то, что файле закодирован в Юникоде. Использование этого символа, согласно спецификации Юникод, не является обязательным, тем не менее его достаточно часто используется. В том-же Notepad можно прочесть и легко перекодировать файл в этих вариантах кодировках.

Для чтения таких файлов в параметрах необходимо указывать параметр encoding = 'utf-8-sig'

→ Ссылка
Автор решения: MarianD

Ваш файл во внутри такой:

\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' не находится в списке»)

→ Ссылка