UnicodeDecodeError
def getWordFreqs(textPath, stopWordsPath):
wordFreqs = dict()
#open the file in read mode and open stop words
file = open(textPath, 'r')
stopWords = set(line.strip() for line in open(stopWordsPath))
#read the text
text = file.read()
#exclude punctuation and convert to lower case; exclude numbers as well
punctuation = set('!"#$%&\()*+,-./:;<=>?@[\\]^_`{|}~')
text = ''.join(ch.lower() for ch in text if ch not in punctuation)
text = ''.join(ch for ch in text if not ch.isdigit())
#read through the words and add to frequency dictionary
#if it is not a stop word
for word in text.split():
if word not in stopWords:
if word in wordFreqs:
wordFreqs[word] += 1
else:
wordFreqs[word] = 1
每次我尝试在python 3.5.2中运行此函数时都会出现以下错误但它在3.4.3中工作正常,我无法弄清楚导致此错误的原因。
line 9, in getWordFreqs
text = file.read()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 520: ordinal not in range(128)
答案 0 :(得分:1)
在Python 3中,open
默认使用locale.getpreferredencoding(False)
返回的编码。但它通常不是ascii
,但如果在某种框架下运行,则可能是错误消息所指示的。
而是指定您尝试阅读的文件的编码。如果文件是在Windows下创建的,则编码可能是cp1252
,特别是因为字节\x97
在该编码下是EM DASH
。
尝试:
file = open(textPath, 'r', encoding='cp1252')
答案 1 :(得分:-2)
我相信解决问题的一种方法是将此代码放在文件的顶部。
import sys
reload(sys)
sys.setdefaultencoding("UTF8")
这会将编码设置为UTF8
另一个(更好的)解决方案是一个名为编解码器的库,它非常易于使用。
import codecs
fileObj = codecs.open( "someFile", "r", "utf-8" )
fileObj是一个可以读写的普通文件对象。
Source for Method 1 Source for Method 2
方法1的注意事项
使用使用ASCII作为编码的第三方应用程序时,这可能非常危险。请谨慎使用。