Исключение возникает во время чтения строки, что происходит в итераторе for
. Вы должны инкапсулировать чтение строки в блок обработки исключений, для которого вам нужно немного больше ручной обработки, чем неявный итератор, предоставляемый for
:
with open('file.txt', 'r', encoding='utf-8') as fh:
while True:
try:
line = fh.readline()
except UnicodeDecodeError:
print('error') # line is obviously not available to output here, since it failed to decode
continue
if not line:
break # end the loop when the file is at its end
print(line)
Обратите внимание, что я не уверен, как это на самом деле ведет себя с битым файлом, возможно ли вообще продолжить чтение после обнаружения битых байтов. Если это не сработает, вам нужно будет сделать это еще больше вручную и открыть файл в режиме 'rb'
, чтобы получить необработанный bytes
, который вы затем вручную попытаетесь набрать .decode('utf-8')
. Этот подход также позволит вам вывести строку, которая не удалось декодировать как необработанные байты, что по определению невозможно при чтении файла как текста.