2013-08-23 7 views
5

В Python 2.7 У меня есть это:UnicodeDecodeError: 'utf8' кодек не может декодировать байт "0xC3"

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
with open("abc.txt","w") as f: 
    f.write(" ".join(i.words())) 

Затем я пытаюсь прочитать в этом документе, в Python 3:

with open("abc.txt", 'r', encoding='utf-8') as f: 
    f.read() 

только для получения:

File "C:\Python32\lib\codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte 

Что я сделал не так? Notepad ++, похоже, указывает, что документ Unicode utf-8. Даже если я попытаюсь преобразовать документ в этот формат с помощью Notepad ++, я все еще получаю эту ошибку в python 3, что странно, так как я прочитал много других закодированных документов utf-8 без каких-либо проблем.

+0

Что говорит о персонажах вокруг этой позиции? –

ответ

3

Я предполагаю, что ваш вход кодируется как ISO-8859-2, который содержит Ă как 0xC3. Проверьте кодировку вашего входного файла.

+0

Notepad ++ говорит, что документ закодирован как UTF8 без спецификации – Baz

+8

@Baz Notepad ++ может ошибаться. Нет надежного способа угадать кодировку. Каждая программа иногда угадывает неправильную кодировку, поэтому вы всегда должны * знать * кодировку файла. Попробуйте перезаписать файл, сделав кодировку utf-8 явным (например, используя 'codecs.open' вместо' open'). – Bakuriu

2

Основываясь на том, что ваш фрагмент Python 2.7 не генерирует исключение, я бы сделал вывод, что i.words() возвращает последовательность байтов. Они вряд ли будут закодированы в UTF8 - я бы предположил, возможно, латинский-1 или что-то в этом роде. Затем вы записываете их в файл. На данный момент никакой кодировки не происходит.

Возможно, вам необходимо преобразовать их в строки unicode, для которых вам необходимо знать их существующую кодировку, а затем вам нужно будет кодировать их как UTF-8 при записи файла.

Например:

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
import codecs 
with codecs.open("abc.txt","w","utf-8") as f: 
    f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words())) 

Некоторые дополнительные замечания, в случае, если есть какая-либо путаница:

  • -*- coding: utf-8 -*- линия относится к кодированию, используемому для записи сам скрипт на Python. Это не влияет на ввод или вывод этого скрипта.
  • В Python 2.7 существует два типа строк: байты, которые представляют собой последовательности байтов с неуказанной кодировкой и строки Unicode, которые являются последовательностями кодов Unicode. Bytestrings являются наиболее распространенными и являются тем, что вы получаете, если используете обычный синтаксис строкового литерала "abc". Строки Unicode - это то, что вы получаете, когда используете синтаксис u"abc".
  • В Python 2.7, если вы просто используете открытую функцию, чтобы открыть файл и записать на него байты, никакого кодирования не произойдет. Байты байтовой строки записываются прямо в файл. Если вы попытаетесь записать в него строки Unicode, вы получите исключение, если они содержат символы, которые не могут быть закодированы кодеком по умолчанию (ASCII).
Смежные вопросы