Считываю файл и перебираю все строки в нём:
fin = open(r'D:\Mega DataBase 2023\pgn\game1.pgn', 'r', encoding='utf-8-sig')
cnt = 0
for row in fin:
cnt += 1
Возникает ошибка:
UnicodeDecodeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_8508\626924785.py in <module>
1 tmp_row = None
2 cnt = 0
----> 3 for row in fin:
4 cnt += 1
C:\ProgramData\Anaconda3\lib\codecs.py in decode(self, input, final)
320 # decode input (taking the buffer into account)
321 data = self.buffer + input
--> 322 (result, consumed) = self._buffer_decode(data, self.errors, final)
323 # keep undecoded input until the next call
324 self.buffer = data[consumed:]
C:\ProgramData\Anaconda3\lib\encodings\utf_8_sig.py in _buffer_decode(self, input, errors, final)
67 codecs.utf_8_decode(input[3:], errors, final)
68 return (output, consumed+3)
---> 69 return codecs.utf_8_decode(input, errors, final)
70
71 def reset(self):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 3539: invalid start byte
Иду смотреть байт на позиции 3539 (0xDD3) и вижу, что он не равен 0xf6:
Почему? Я не так смотрю?
Далее, python сообщает мне, что байт 0xf6 – invalid start byte. Но, 0xf6 = 0b11110110, то есть это как раз валидный стартовый байт в utf-8 для 4-байтных символов (см.
Wikipedia).
Опять непонятки... Это python вводим меня в заблуждение или я чего-то не понимаю?
PS. Читаемый файл закодирован в кодировке utf-8(BOM), так как начинается с BOM: EF BB BF.
Перебор кодировок в open() проблему не решил.
Проблема решена:
Нашёл байт 0xf6 и 3 байта, следующие за ним:
f6 77 2c 0d = 11110110 01110111 00101100 00001101
Видно, что эта последовательность не валидна для utf-8.
b'\xf6\x77\x2c\x0d'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 0: invalid start byte
Оказалось, что файл закодирован кодировкой latin-1 (она же iso-8859-1):
b'\xf6\x77\x2c\x0d'.decode('latin-1')
'öw,\r'