Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Ошибка кодировки в Python: readline() при чтении utf-8 файла ругается: 'charmap' codec can't decode byte

#python #кодировка #python_2x #unicode


Пытаюсь читать файл портов от IANA. Он сохранен в кодировке UTF-8 w/o BOM.
Но на одной из строк функция readline() ругается вот таким вот образом


  'charmap' codec can't decode byte 0x98
  in position 7938: character maps to
  <"undefined">


Строка в файле выглядит следующим образом:


  #                          Jim Harlan <"jimh&infowest.com">


Какой костыль придумать для этого? Или есть прямой путь решения?

UPD

Ибо костыль в виде удаления данной строки пойдет (причем она, почему-то вот такая
одна), но только на время отладки, ибо потом вдруг что, партнеры будут рвать волосы
на моей голове. Так же выложу код, которым пользуюсь для данной операции:

try:
    file = open(path, 'r')
    while True:
        line = file.readline()
        if(not line):
            break
        print(line)
finally:
    file.close()

    


Ответы

Ответ 1



попробуйте использовать встроенную библиотеку codecs: import codecs fileObj = codecs.open( "someFilePath", "r", "utf_8_sig" ) text = fileObj.read() # или читайте по строке fileObj.close()

Ответ 2



Чтобы прочитать текстовый файл, закодированный с использованием utf-8 кодировки в Питоне, можно использовать io.open() функцию, которая доступна как встроенная open() в Питоне 3: #!/usr/bin/env python import io with io.open(path, encoding='utf-8') as file: for line in file: process(line) Если в файле возможны ошибки, связанные с кодировкой: сама кодировка верна, но могут быть мелкие погрешности, тогда можно передать errors='ignore' обработчик ошибок (или другое значение в зависимости от конкретной ситуации). Не используйте codecs, который может некорректно работать с режимом универсальных строк. Не нужно менять вашу кодовую страницу на cp65001, чтобы utf-8 файл прочитать. Если хотите напечатать Unicode в Виндовую консоль, то см. Как из Python вывести на Windows-консоль строку в Юникоде?

Ответ 3



file = codecs.open(path, encoding='utf-8', mode='r')

Ответ 4



Постоянно ловил эту ошибку, раз за разом. Решение увидел здесь. import codecs file = codecs.open( "yourFile", "r", "utf-8" ) data = file.read() file .close() chcp 65001 в командной строке Этими не сложными действиями проблема решена.

Комментариев нет:

Отправить комментарий