2010-12-29 2 views
3
File "/usr/lib/python3.1/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 805: invalid start byte 

Привет, я получаю это исключение. Как я его поймаю и продолжаю читать мои файлы, когда получаю это исключение.За исключением ошибок кодека Python?

В моей программе есть цикл, который читает текстовый файл по строкам и пытается выполнить некоторую обработку. Однако некоторые файлы, с которыми я сталкиваюсь, могут не быть текстовыми файлами или иметь строки, которые должным образом не отформатированы (иностранный язык и т. Д.). Я хочу игнорировать эти строки.

Ниже не работает

for line in sys.stdin: 
    if line != "": 
     try: 
     matched = re.match(searchstuff, line, re.IGNORECASE) 
     print (matched) 
     except UnicodeDecodeError, UnicodeEncodeError: 
     continue 
+0

В учебнике Python есть целая ** ГЛАВА **, посвященная * ошибкам и исключениям. Попробуйте. http://docs.python.org/tutorial/errors.html –

+0

Да, я понял. Я не спрашиваю, есть ли у Python функции, связанные с ошибками и исключениями. Я использую try, except statements, но эти ошибки декодирования кодеков не исключаются, что приводит к неудачным заданиям. – Deepak

+0

Пожалуйста, разместите короткий, но неотредактированный код. Являются ли ** буквально в вашем коде? – phihag

ответ

6

Посмотрите на http://docs.python.org/py3k/library/codecs.html. Когда вы открываете поток кодеков, вы, вероятно, хотите использовать дополнительный аргумент errors='ignore'

В Python 3, sys.stdin по умолчанию открыт как текстовый поток (см http://docs.python.org/py3k/library/sys.html), и имеет строгую проверку на наличие ошибок.

Вам необходимо повторно открыть его как устойчивый к ошибкам поток utf-8. Что-то вроде этого будет работать:

sys.stdin = codecs.getreader('utf8')(sys.stdin.detach(), errors='ignore') 
+1

Он работает 3.1, поэтому не * довольно * это. –

+0

@ Ignacio хорошая точка, но ответ тот же - я исправил ссылку на документы py3k. –

+1

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