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


208

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

张贴这个问题之前我已经提到这个问题,操作系统,所以的。


更新

下一行损害了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() })

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


1
看来您词典中有一些无法编码/解码的字符串数据。里面有什么dict
mgilson 2014年

@mgilson烨主我理解这个问题,但唐诺如何处理它..dictlist, dict, python timestamp value
迪派Ingole

1
@Pilot-并非如此。真正的问题被埋在了某个地方__getdata。我不知道为什么你得到一个不可解码字符。您可以尝试为该字典准备补丁,以使其正常运行,但是这些补丁大多只是在以后询问更多问题。我会尝试打印字典,以查看非ascii字符在哪里。然后弄清楚该字段是如何计算/设置的,然后从那里反向工作。
mgilson 2014年


1
尝试读取包含一些非ascii字符的.csv文件时,我遇到了同样的错误。删除这些字符(如下所示)解决了该问题。
Dmitriy R. Starson '17

Answers:


95

该错误是因为字典中存在一些非ASCII字符,并且无法对其进行编码/解码。避免此错误的一种简单方法是使用encode()如下功能对此类字符串进行编码(如果a字符串为非ascii字符):

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

2
由于UTF-8与老式的7位ASCII向后兼容,因此您应该对所有内容进行编码。对于7位ASCII范围内的字符,此编码将是一个标识映射。
Tadeusz A.Kadłubowski14年

39
这似乎并不十分清楚。导入csv文件时,如何使用此代码?
戴夫

对我来说,执行sqlalchemy查询时会出现相同的问题,我该如何编码查询(没有.encode,因为它不是字符串)?
c8999c 3f964f64

168

我仅通过在read_csv()命令中定义其他编解码器包来切换此设置:

encoding = 'unicode_escape'

例如:

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

4
仅当您使用pandas
Valeriy,

2
抱歉,这没有用,我又遇到了同样的错误。但是当我使用('filename.csv',engine ='python')时。这工作了。
basavaraj_S

124

试试下面的代码片段:

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

7
我有r代替rb。谢谢您的补充b
保罗

1
默认情况下,open功能具有“ r”作为只读模式。rb代表读取二进制模式。
shiva

39

您的字符串中包含一个非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


1
我创建了一个简单的页面,可以帮助建立一些意外的“神秘字节”的编码;Tripleee.github.io/8bit
Tripleee

35

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

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

19

此解决方案为我工作:

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


17

从2018-05开始decode,至少可以直接使用Python 3直接处理此问题。

我正在使用以下代码段输入invalid start byteinvalid continuation byte输入错误。添加errors='ignore'为我修复。

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

1
当然,这会无声地丢弃信息。更好的解决方法是弄清楚应该存在什么,并解决原始问题。
tripleee

15

灵感来自@aaronpenne和@Soumyaansh

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

我收到“ AttributeError:'str'对象没有属性'decode'”。不知道出了什么问题?
Victor Wong

您是否在“ rb”中添加了b?b用于以字节格式打开文件。如果仅使用r,则它是字符串,并且不包含解码。
Punnerud

13

简单的解决方案:

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

3
谢谢帮助!
鲁宾

很高兴为@Ruben提供帮助
Gil Baggio

2
谢谢你,这对我有所帮助。我在做熊猫。再次感谢
basavaraj_S

乐于帮助@basavaraj_S
Gil Baggio

1
在这里介绍的所有解决方案中,唯一适用于我的解决方案。
lunesco

7

下一行损害了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() })

将其标记为正确(作为临时解决方案)(不确定)。


5

如果上述方法不适合您,则可能需要研究更改encodingcsv file本身。

使用Excel:

  1. csv使用打开文件Excel
  2. 导航到“文件”菜单选项,然后单击“另存为”
  3. 单击浏览以选择保存文件的位置
  4. 输入想要的文件名
  5. 选择CSV (Comma delimited) (*.csv)选项
  6. 单击工具下拉框,然后单击Web选项。
  7. 在“编码”选项卡下,Unicode (UTF-8)从“将此文档另存为”下拉列表中选择选项。
  8. 保存文件

使用记事本:

  1. csv file使用记事本打开
  2. 导航到文件>另存为选项
  3. 接下来,选择文件的位置
  4. 选择“保存类型”选项作为“所有文件”(
  5. 指定带.csv扩展名的文件名
  6. 编码下拉列表中,选择UTF-8选项。
  7. 单击保存以保存文件

这样,您应该能够在import csv不遇到的情况下进行归档UnicodeCodeError


2

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

utf-8 是默认值。

iso8859-1 西欧也很受欢迎。

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

请参阅:文档


1
盲目猜测编码可能会产生更多错误。在不真正知道文件使用哪种编码的情况下选择iso8859-1或cp1251等将消除症状,但是如果您猜错了,则会产生垃圾。如果只有几个字节,则可能需要数年时间才能发现并修复真正的错误。
18:53三胞胎

2

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

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



0

就我而言,我不得不将文件另存为带有BOM的UTF8,而不仅仅是UTF8 utf8这个错误消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.