Python 如何解决;UnicodeDecodeError:&x27;ascii';编解码器可以';t解码字节";

Python 如何解决;UnicodeDecodeError:&x27;ascii';编解码器可以';t解码字节";,python,Python,我正在编写一个程序,用于计算文件中的大致字数,并得到一个错误,说明“ascii”编解码器无法解码字节 如何消除此错误 以下是上述错误的回溯: Traceback (most recent call last): File "/Users/NikolaMac/Desktop/alice.py", line 23, in <module> contents = f_obj.read() File "/Library/Frameworks/Python.framework/

我正在编写一个程序,用于计算文件中的大致字数,并得到一个错误,说明
“ascii”编解码器无法解码字节

如何消除此错误

以下是上述错误的回溯:

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)"

错误消息表示它尝试使用ASCII解码。您可能需要指定不同的编码

我能看到的程序中唯一的编码部分是
open
调用。根据,如果不显式传递编码

默认编码依赖于平台(无论
locale.getpreferredencoding()返回什么)


尝试将
encoding='utf-8'
传递到
open
调用。

错误消息表示它尝试使用ASCII解码。您可能需要指定不同的编码

我能看到的程序中唯一的编码部分是
open
调用。根据,如果不显式传递编码

默认编码依赖于平台(无论
locale.getpreferredencoding()返回什么)


尝试将
encoding='utf-8'
传递给
open
调用。

我相信每个编码都将空格字符编码为
0x20
(根据经验,没有确凿证据)。如果只需计算字数,则可以通过检查文件中
0x20
字节数,然后向其中添加1,跳过解码过程。这个简单的方法可以得到一个近似值

使用该方法,您可能需要考虑在文件的开头或结尾减去空格数,因为这意味着没有关于该空间的单词。UTF-16将空间编码为

0x20 0x00
,因此,如果文档以空格开头或结尾,则文件开头或结尾可能有空字节。还有一些编码在文件的开头加上字节顺序标记,在这种情况下,文本不会从开头开始


您不能将regex与此方法一起使用,因此如果您想以非拉丁语为基础的语言解析文档,它将不起作用。

我相信,所有编码都将空格字符编码为
0x20
(根据经验,没有确凿证据)。如果只需计算字数,则可以通过检查文件中
0x20
字节数,然后向其中添加1,跳过解码过程。这个简单的方法可以得到一个近似值

使用该方法,您可能需要考虑在文件的开头或结尾减去空格数,因为这意味着没有关于该空间的单词。UTF-16将空间编码为

0x20 0x00
,因此,如果文档以空格开头或结尾,则文件开头或结尾可能有空字节。还有一些编码在文件的开头加上字节顺序标记,在这种情况下,文本不会从开头开始


您不能将regex与此方法一起使用,因此如果您想以非拉丁语为基础的语言解析文档,它将不起作用。

您需要使用
io.open
函数,并将编码传递给它

试试这个:

import io

with io.open(filename, encoding='utf-8') as f_obj:
    contents = f_obj.read()

print('Words: %d'%len(contents.split(' ')))

您需要使用
io.open
函数,并将编码传递给它

试试这个:

import io

with io.open(filename, encoding='utf-8') as f_obj:
    contents = f_obj.read()

print('Words: %d'%len(contents.split(' ')))

@MyleShallow错误消息显示Python 3.6。@MyleShallow错误消息显示Python 3.6。我认为这不是一个很好的方法。。。那么连续空格或其他空白标记呢?@robinsax说得好。可以考虑连续空格。我不知道什么是空白标记。我认为这不是一个很好的方法。。。那么连续空格或其他空白标记呢?@robinsax说得好。可以考虑连续空格。我不知道空白标记是什么。我能在终端中做些什么来使用这种编码而不需要额外的代码吗?你想做什么?我能在终端中做些什么来使用这种编码而不需要额外的代码吗?你想做什么?