UnicodeDecodeError:'utf8' 编解码器无法解码位置 0 的字节 0xa5:无效的起始字节

408 投票
22 回答
1983975 浏览
提问于 2025-04-17 21:03

我在使用 Python-2.6 CGI 脚本时,发现服务器日志里出现了一个错误,错误发生在调用 json.dumps() 的时候。

Traceback (most recent call last):
  File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
    print json.dumps(​​__get​data())
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte

这里,__getdata() 函数返回的是一个字典。

在发这个问题之前,我看过 这个 问题。请问我该如何解决这个错误呢?

22 个回答

41

在读取 csv 文件时,我添加了一种编码方法:

import pandas as pd
dataset = pd.read_csv('sample_data.csv', header= 0,
                        encoding= 'unicode_escape')
56

你的字符串里面有一个不是ascii字符的编码。

如果你不能用utf-8来解码,可能是因为你的代码里用了其他的编码方式。例如:

>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

在这个例子中,编码是windows-1252,所以你需要这样做:

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

现在你得到了Unicode,你就可以安全地转换成utf-8了。

188

默认情况下,打开文件的函数是以 'r' 模式运行的,也就是只读模式。这可以改成 'rb' 模式,也就是以二进制格式读取。

你可以试试下面的代码片段:

with open(path, 'rb') as f:
  text = f.read()
404

如果你在尝试读取一个csv文件时遇到这个错误,pandas库里的read_csv()函数可以让你设置文件的编码方式:

import pandas as pd
data = pd.read_csv(filename, encoding='unicode_escape')
121

这个错误是因为字典里有一些非ASCII字符,这些字符无法被编码或解码。避免这个错误的一个简单方法是使用encode()函数来编码这些字符串,方法如下(假设a是包含非ASCII字符的字符串):

a.encode('utf-8').strip()

撰写回答