首页 > 解决方案 > “ascii”编解码器无法解码位置 28 中的字节 0xad:序数不在范围内(128)

问题描述

我正在实现应用程序,我有一个场景,即在规范化文件后读取文件,但在读取文件时出现以下错误:以下是我的尝试

  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)

标签: pythonunicodeasciitext-processing

解决方案


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

值得一提的是,U+00AD是一个软连字符,与绝大多数 Unicode 字符一样,它没有相应的纯 ASCII 字符,尽管您可以使用常规的 dash/minus/hyphen 来近似它-。但是,内置'replace'功能将简单地用问号替换它:

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

推荐阅读