我正在编写一个程序来计算文件中的大致单词数,并收到一个错误,指出'ascii' codec can't decode byte
。
如何消除此错误?
以下是上述错误的回溯:
Traceback (most recent call last):
File "/Users/NikolaMac/Desktop/alice.py", line 23, in <module>
contents = f_obj.read()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)"
这是我的代码:
filename='alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# Count the approximate number of words in the file.
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) + " words.")
您需要改用io.open
函数,并向其传递编码。
试试这个:
import io
with io.open(filename, encoding='utf-8') as f_obj:
contents = f_obj.read()
print('Words: %d'%len(contents.split(' ')))
错误消息指出它尝试使用 ASCII 解码。您可能需要指定不同的编码。
我可以看到您的程序的唯一部分是编码可以进入的地方是open
调用。根据文档,如果您没有显式传入编码,
默认编码取决于平台(无论返回什么
locale.getpreferredencoding()
(
尝试将encoding='utf-8'
传递给open
呼叫。
我相信每个编码都将空格字符编码为0x20
(出于经验,而不是确凿的证据(。如果您需要做的就是计算单词数,则可以通过检查文件中的0x20
字节数来跳过解码过程,然后向其添加 1。这个简单的方法会给你一个近似值。
使用该方法,您可能需要考虑减去文件开头或结尾的空格数,因为这意味着该空格周围没有单词。UTF-16 将空格编码为0x20 0x00
,因此如果文档以空格开头或结尾,则文件的开头或结尾可能存在空字节。此外,一些编码在文件的开头放置了一个字节顺序标记,在这种情况下,文本不会从头开始。
您不能将正则表达式与此方法一起使用,因此如果您想解析非基于拉丁语的语言的文档,它将不起作用。