У меня есть следующая функция:
def storeTaggedCorpus(corpus, filename):
corpusFile = codecs.open(filename, mode = 'w', encoding = 'utf-8')
for token in corpus:
tagged_token = '/'.join(str for str in token)
tagged_token = tagged_token.decode('ISO-8859-1')
tagged_token = tagged_token.encode('utf-8')
corpusFile.write(tagged_token)
corpusFile.write(u"\n")
corpusFile.close()
И когда я ее выполняю, у меня появляется следующая ошибка:
(...) in storeTaggedCorpus
corpusFile.write(tagged_token)
File "c:\Python26\lib\codecs.py", line 691, in write
return self.writer.write(data)
File "c:\Python26\lib\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Итак, я пошел отлаживать ее и обнаружилчто созданный файл был закодирован как ANSI, а не как UTF-8, как объявлено в corpusFile = codecs.open(filename, mode = 'w', encoding = 'utf-8')
.Если удалить corpusFile.write(tagged_token)
, эта функция (очевидно) будет работать, и файл будет закодирован как ANSI.Если вместо этого я удаляю tagged_token = tagged_token.encode('utf-8')
, он также будет работать, НО , полученный файл будет иметь кодировку "ANSI as UTF-8" (???) и символы латинского алфавита будут искажены.Поскольку я анализирую текст pt-br, это недопустимо.
Я считаю, что все будет работать нормально, если corpusFile будет открыт как UTF-8, но я не могу заставить его работать.Я искал в Интернете, но все, что я нашел в Python / Unicode, касалось чего-то еще ... s Так почему этот файл всегда заканчивается в ANSI?Я использую Python 2.6 в Windows 7 x64, и эти кодировки файлов были получены из Notepad ++.
Редактировать - О параметре corpus
Я не знаю кодировку corpus
строкаОн был сгенерирован методом PlaintextCorpusReader.tag()
, из NLTK .Исходный файл корпуса был закодирован в UTF-8, в соответствии с Notepad ++.tagged_token.decode('ISO-8859-1')
это просто предположение.Я попытался декодировать его как cp1252 и получил те же искаженные символы из ISO-8859-1.