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

Posted

技术标签:

【中文标题】UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xa5:无效的起始字节【英文标题】:UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte 【发布时间】:2014-04-08 14:13:15 【问题描述】:

我正在使用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

​这里,

​__get​data() 函数返回dictionary

在发布这个问题之前,我已经提到 this 的问题 os SO。


更新

下面这行正在伤害 JSON 编码器,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps('current_time': now) # this is the culprit

我有一个临时修复它

print json.dumps( 'old_time': now.encode('ISO-8859-1').strip() )

但我不确定这样做是否正确。

【问题讨论】:

看起来您的字典中有一些无法编码/解码的字符串数据。 dict 中有什么内容? @mgilson yup master 我理解这个问题,但不知道如何处理它..dictlist, dict, python timestamp value @Pilot -- 不是真的。真正的问题隐藏在__getdata 的某个地方。我不知道 为什么 你得到一个不可解码的字符。您可以尝试在 dict 上提供补丁以使其正常工作,但这些补丁大多只是在以后提出更多问题。我会尝试打印 dict 以查看非 ascii 字符的位置。然后弄清楚该字段是如何计算/设置的并从那里向后工作。 UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c 的可能重复项。 我在尝试读取包含一些非 ascii 字符的 .csv 文件时遇到了同样的错误。删除这些字符(如下所示)解决了这个问题。 【参考方案1】:

该错误是因为字典中有一些非 ascii 字符,无法对其进行编码/解码。避免此错误的一种简单方法是使用encode() 函数对此类字符串进行编码,如下所示(如果a 是具有非ascii 字符的字符串):

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

【讨论】:

由于 UTF-8 与老式 7 位 ASCII 向后兼容,因此您应该对所有内容进行编码。对于 7 位 ASCII 范围内的字符,此编码将是一个身份映射。 这似乎不太清楚。导入csv文件时如何使用这段代码? 在执行 sqlalchemy 查询时出现同样的问题,我将如何对查询进行编码(没有 .encode,因为它不是字符串)?【参考方案2】:

下面这行正在伤害 JSON 编码器,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps('current_time': now) // this is the culprit

我有一个临时修复它

print json.dumps( 'old_time': now.encode('ISO-8859-1').strip() )

将此标记为正确的临时修复(不确定)。

【讨论】:

【参考方案3】:

在代码顶部设置默认编码器

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")

【讨论】:

我认为python3在sys模块中没有setdefaultencoding!【参考方案4】:

您的字符串中编码了一个非 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

【讨论】:

我创建了一个简单的页面,可以帮助建立一些意想不到的“神秘字节”的编码; tripleee.github.io/8bit【参考方案5】:

在尝试了上述所有解决方法后,如果仍然抛出相同的错误,您可以尝试将文件导出为CSV(如果您已经有,请再次导出)。 特别是如果您使用scikit learn,最好将import 数据集作为CSV file

我一起度过了几个小时,而解决方案就是这么简单。将文件以 CSV 格式导出到 Anaconda 或您的分类器工具的安装目录并尝试。

【讨论】:

【参考方案6】:

试试下面的代码 sn-p:

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

【讨论】:

我有r 而不是rb。感谢您提醒添加b 默认情况下open 函数将 'r' 设为只读模式。 rb 代表读取二进制模式。【参考方案7】:

自 2018 年 5 月起,此问题由 decode, at least for Python 3 直接处理。

我使用下面的 sn-p 来处理 invalid start byteinvalid continuation byte 类型错误。添加errors='ignore' 为我修复了它。

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))

【讨论】:

当然,这会默默地丢弃信息。更好的解决方法是找出应该存在的问题,并解决最初的问题。【参考方案8】:

我只是通过在read_csv() 命令中定义不同的编解码器包来切换它:

encoding = 'unicode_escape'

例如:

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

【讨论】:

仅当您使用pandas 对不起,这不起作用,我又遇到了同样的错误。但是当我使用('filename.csv',engine ='python')时。这行得通。 也适用于 pysrt,pysrt.open(subfilename, encoding='unicode_escape') 我认为这个解决方案应该适用于任何支持文件打开编码的库的未编码文本/纯文本“ unicode_escape" 将打开文件,但如果您有非 ascii,则应提供特定编码,例如土耳其语 encoding='ISO-8859-9' 今天帮了我。非常感谢【参考方案9】:

灵感来自 @aaronpenne 和 @Soumyaansh

f = open("file.txt", "rb")
text = f.read().decode(errors='replace')

【讨论】:

我得到“AttributeError:'str'对象没有属性'decode'”。不知道出了什么问题? 您是否在“rb”中加入了 b? b 用于以字节格式打开文件。如果你只使用 r 它是字符串,并且不包括解码。【参考方案10】:

如果上述方法不适合您,您可能需要考虑更改 encoding 本身的 encoding

使用 Excel:

    使用Excel 打开csv 文件 导航到文件菜单选项并点击另存为 点击浏览选择保存文件的位置 输入预期的文件名 选择CSV (Comma delimited) (*.csv)选项 点击工具下拉框,然后点击Web选项编码标签下,从将此文档另存为下拉列表中选择Unicode (UTF-8)选项 保存文件

使用记事本:

    使用记事本打开csv file 导航到文件 > 另存为选项 接下来,选择文件的位置 选择保存类型选项为所有文件(.) 指定带有.csv扩展名的文件名 从编码下拉列表中,选择UTF-8选项。 点击保存保存文件

通过这样做,您应该能够import csv 文件而不会遇到UnicodeCodeError

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

您可以使用您的特定用途和输入的任何标准编码。

utf-8 是默认设置。

iso8859-1 在西欧也很受欢迎。

例如:bytes_obj.decode('iso8859-1')

见:docs

【讨论】:

盲目猜测编码很可能会产生更多错误。在不知道文件使用哪种编码的情况下选择 iso8859-1 或 cp1251 等会消除症状,但如果您猜错了会产生垃圾。如果只是几个字节,您可能需要数年时间才能注意到并修复 real 错误。【参考方案13】:

简单的解决方案:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

【讨论】:

这里介绍的所有解决方案中唯一适合我的解决方案。 这个解决方案帮助我打开了带有 korean 语言的 csv 文件。谢谢【参考方案14】:

这个解决方案对我有用:

import pandas as pd
data = pd.read_csv("training.csv", encoding = 'unicode_escape')

【讨论】:

【参考方案15】:

与其寻找解码 a5 (Yen ¥) 或 96 (en-dash ) 的方法,不如告诉 mysql 您的客户端编码为“latin1”,但您希望在数据库中使用“utf8”。

详情见Trouble with UTF-8 characters; what I see is not what I stored

【讨论】:

【参考方案16】:

在我的情况下,我必须将文件保存为 UTF8 with BOM 而不仅仅是 UTF8 utf8 然后这个错误就消失了。

【讨论】:

【参考方案17】:
from io import BytesIO

df = pd.read_excel(BytesIO(bytes_content), engine='openpyxl')

为我工作

【讨论】:

bytes_content 来自哪里? bytes_content 只是一个示例变量,包含像对象这样的字节【参考方案18】:

以下 sn-p 对我有用。

import pandas as pd
df = pd.read_csv(filename, sep = ';', encoding = 'latin1', error_bad_lines=False) #error_bad_lines is avoid single line error

【讨论】:

以上是关于UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xa5:无效的起始字节的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节

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

Django:/accounts/ProfileDetails/'utf8' 处的 UnicodeDecodeError 编解码器无法解码位置 5915 中的字节 0xe1:无效的继续字节

flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方

python-使用pip安装第三方库报UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 7

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start