如何解决"UnicodeDecodeError: 'ascii' codec can't decode byte"



我正在编写一个程序来计算文件中的大致单词数,并收到一个错误,指出'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,因此如果文档以空格开头或结尾,则文件的开头或结尾可能存在空字节。此外,一些编码在文件的开头放置了一个字节顺序标记,在这种情况下,文本不会从头开始。

您不能将正则表达式与此方法一起使用,因此如果您想解析非基于拉丁语的语言的文档,它将不起作用。

相关内容

最新更新