Кодек 'ascii' не может декодировать байт 0xad в позиции 28: порядковый номер не в диапазоне (128) - PullRequest
0 голосов
/ 08 февраля 2019

Я реализую приложение, в котором у меня есть один сценарий: чтение файла после его нормализации, но при чтении файла я получаю следующую ошибку: Ниже приведена моя ошибка Try

  def unicodeToAscii(self,s):
        return ''.join(c for c in unicodedata.normalize('NFD',s) if unicodedata.category(c)!='Mn')

def normalizeString(self,s):
        s=self.unicodeToAscii(s.lower().strip())
        s=re.sub(r"([.!?])",r" \1",s)
        s=re.sub(r"([^a-zA-Z.!?])",r" ",s)
        s=re.sub(r"(\s+)",r" ",s).strip()
        return s

dataFile=os.path.join('/home/amit/Downloads/cornell_movie_dialogs_corpus/cornell movie-dialogs corpus','formatted_movie_lines')
print('please wait .. reading a file') 

lines =open(dataFile).read().strip().split('\n')
vocal=Vocabulary()
pairs=[[vocal.normalizeString(unicode(s))for s in pair.split('\t')] for pair in lines]
print('done reading')

:

please wait .. reading a file
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-2-4142a7dbef84> in <module>()
    118 lines =open(dataFile).read().strip().split('\n')
    119 vocal=Vocabulary()
--> 120 pairs=[[vocal.normalizeString(unicode(s))for s in pair.split('\t')] for pair in lines]
    121 print('done reading')
    122 

UnicodeDecodeError: 'ascii' codec can't decode byte 0xad in position 28: ordinal not in range(128)

1 Ответ

0 голосов
/ 08 февраля 2019

Нормация Юникода, которую вы выполняете, это , а не , конвертирующая все в ASCII.Он просто применяет нормализацию Unicode, которая гарантирует, что варианты кодирования все выражены одинаково.(Кроме того, вы избегаете этого для категории Mn, поэтому нормализация также неполная.)

Для чего бы это ни стоило, U + 00AD - это мягкий дефис, который- как и подавляющее большинство символов Юникода - не имеет соответствующего чистого символа ASCII, хотя вы можете аппроксимировать его обычным тире / минус / дефис -.Встроенная функциональность 'replace' просто заменит его знаком вопроса, однако:

>>> '\00ad'.encode('ascii', 'replace')
b'?'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...