Задать вопрос
Lord_of_Rings
@Lord_of_Rings
Дунадан - северный странник. Злой, но очень добрый

Как обработать ошибку UnicodeDecodeError и при этом продолжить чтение файла?

Допустим у меня есть такой код
with open('1.txt', 'w') as file:
    for line in file:
        print(line)


В какой-то момент во второй строке (for line in file:) происходит ошибка UnicodeDecodeError. Мне надо перехватить её, напечатать что возникла ошибка и продолжить выполнение цикла. Но как это сделать? Если я просто впихну это в try/except
with open('1.txt', 'w') as file:
    try:
        for line in file:
            print(line)
    except UnicodeDecodeError:
        # ...

То естественно дальше "неправильной" строки дело так и не пойдёт.
Какие есть варианты красивого решения этой проблемы?
  • Вопрос задан
  • 219 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
drygdryg
@drygdryg
Python-разработчик
Откройте файл в двоичном режиме, читайте его построчно в цикле и пытайтесь отдельно декодировать каждую байтовую строку в строку с помощью .decode(), в одночасье обрабатывая ошибку UnicodeDecodeError:
with open('1.txt', 'rb') as file:
    for n, binary_line in enumerate(file, start=1):
        try:
            line = binary_line.decode('utf-8')
        except UnicodeDecodeError:
            print(f'Ошибка декодирования строки {n}')
            continue
        ...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@whoiam_frontend
Python-разработчик
Нужно обработать ошибку внутри цикла, а не во внешнем блоке try/except. Также, нужно указать кодировку файла при открытии его в функции open(). Например, если файл написан в utf-8, то код будет следующим:

with open('1.txt', 'r', encoding='utf-8') as file:
    for line in file:
        try:
            print(line)
        except UnicodeDecodeError:
            print("Ошибка: не удалось расшифровать строку")
            continue


Здесь мы указали, что файл должен открываться на чтение ("r"), и что его кодировка utf-8. Внутри цикла мы перехватываем ошибку UnicodeDecodeError при попытке расшифровать строку и продолжаем выполнение цикла с помощью команды continue. Таким образом, если возникает ошибка, мы получаем сообщение об ошибке и продолжаем чтение файла.
Ответ написан
Vindicar
@Vindicar
RTFM!
Альтернативное решение - использовать не обёртку for ... in file, а использовать цикл while и вызывать file.readline() вручную.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы