Python ';ascii';编解码器可以';t解码位置28处的字节0xad:序号不在范围内(128)

Python ';ascii';编解码器可以';t解码位置28处的字节0xad:序号不在范围内(128),python,unicode,ascii,text-processing,Python,Unicode,Ascii,Text Processing,我正在实现一个应用程序,我有一个场景,那就是正常化后读取文件,但在读取文件时,我得到以下错误:下面是我的尝试 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.lowe

我正在实现一个应用程序,我有一个场景,那就是正常化后读取文件,但在读取文件时,我得到以下错误:下面是我的尝试

  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)
请稍候。。读取文件
---------------------------------------------------------------------------
UnicodeDecodeError回溯(最近一次呼叫最后一次)
在()
118行=打开(数据文件).read().strip().split('\n')
119语音=词汇()
-->120对=[[SOCOL.normalizeString(unicode(s))表示对中的s。拆分('\t')]表示对中的行]
121打印(“完成读取”)
122
UnicodeDecodeError:“ascii”编解码器无法解码第28位的字节0xad:序号不在范围内(128)

您正在执行的Unicode规范化并不是将所有内容都转换为ASCII。它简单地应用了Unicode规范化,以确保所有代码都以相同的方式表示。(此外,对于
Mn
类别,您避免了这种情况,因此规范化也不完整。)

值得一提的是,它是一个软连字符,与绝大多数Unicode字符一样,它没有相应的纯ASCII字符,尽管您可以使用常规的破折号/减号/连字符来近似它。内置的
'replace'
功能只需将其替换为问号即可,不过:

>>> '\00ad'.encode('ascii', 'replace')
b'?'

unicodeToAscii()
中有什么内容?@tripleee我已经更新了代码,我100%确定代码是因为unicodeToAscii而中断的。当我不调用此方法时,则没有错误。不知道当我显式调用unicodeToAscii()方法时,它工作正常,但是当我调用normalizeString()方法时,它是通过我发出的错误。你有理由想摆脱Unicode吗?合理的方法可能只是简单地使用正确的Unicode输入使代码正常工作。实际上,我正在执行文本处理,因此需要删除Unicode字符(如果存在),我这样做是因为我必须在LSTM中训练我的模型,如果有unicode字符,则准确率将降低问题本身与机器学习无关。-请不要垃圾邮件标记(已删除)。“完成”具体是什么,您希望实际做什么?