2015-01-24 2 views
0

У меня есть большой файл, который имеет много строк, большинство строк - utf8, но похоже, что некоторые строки не являются utf8. Когда я пытаюсь читать строки с кодом, как это:UnicodeDecodeError: 'utf8' в Python 2.7

in_file = codecs.open(source, "r", "utf-8") 
    for line in in_file: 
     SOME OPERATIONS 

Я получаю следующее сообщение об ошибке:

for line in in_file: 
    File "C:\Python27\lib\codecs.py", line 681, in next 
    return self.reader.next() 
    File "C:\Python27\lib\codecs.py", line 612, in next 
    line = self.readline() 
    File "C:\Python27\lib\codecs.py", line 527, in readline 
    data = self.read(readsize, firstline=True) 
    File "C:\Python27\lib\codecs.py", line 474, in read 
    newchars, decodedbytes = self.decode(data, self.errors) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd8 in position 0: invalid continuation byte 

То, что я хотел бы сделать то, что для линий, которые не являются ни utf8 делать ничего, не нарушая кода, а затем перейдите к следующей строке в файле и выполните мои операции. Как я могу это сделать с try и except?

+0

Откуда вы знаете файл * в основном * UTF-8? Возможно, это CP1252 или Latin-1, тогда это будет * в основном * ASCII (подмножество UTF-8), но вы все равно выбрали неправильный кодек. –

+1

Вы можете сказать 'codecs.open()' обрабатывать ошибки, заменяя символы, которые он не может декодировать с помощью заполнителей или вообще игнорировать их, но вы должны убедиться, что у вас действительно есть правильный кодек здесь. –

+3

Я знаю, что файл в основном UTF-8, потому что я смотрю контент, и я вижу, что это не-английский язык. – TJ1

ответ

1

Открыть файл без каких-либо кодеков. Затем прочитайте файл по строкам и попробуйте декодировать каждую строку из UTF-8. Если это вызывает исключение, пропустите строку.

Совершенно другой подход заключается в том, чтобы сказать кодеку заменить или проигнорировать неисправные символы. Это не пропускает строки, но вы, похоже, не слишком заботитесь о содержащихся в нем данных, поэтому это может быть альтернатива.

+0

Спасибо за умные ответы. Оба метода будут работать для меня. – TJ1

Смежные вопросы