ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 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 是的主人,我理解这个问题,但不知道如何处理它..dictlist, dict, python timestamp value
@Pilot - 不是真的。真正的问题隐藏在 __getdata 的某个地方。我不知道 为什么 你得到一个不可解码的字符。您可以尝试在 dict 上提供补丁以使其正常工作,但这些补丁大多只是在稍后提出更多问题。我会尝试打印 dict 以查看非 ascii 字符的位置。然后弄清楚该字段是如何计算/设置的并从那里向后工作。
尝试读取其中包含一些非 ascii 字符的 .csv 文件时,我遇到了同样的错误。删除这些字符(如下所示)解决了这个问题。

s
shiva

我只是通过在 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'
今天帮助了我..非常感谢
谢谢!今天它救了我!
F
Felipe Augusto

试试下面的代码片段:

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

我有 r 而不是 rb。感谢您提醒添加 b
默认情况下,open 函数将“r”作为只读模式。 rb 代表读取二进制模式。
J
Jean-Francois T.

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

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

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

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

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

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

s
shiva

这个解决方案对我有用:

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

s
shiva

灵感来自@aaronpenne 和@Soumyaansh

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

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

从 2018 年 5 月起,这将直接由 decode, at least for 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'))

当然,这会默默地丢弃信息。更好的解决方法是找出应该存在的内容,并修复原始问题。
G
Gil Baggio

简单的解决方案:

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

在此处介绍的所有解决方案中,唯一适合我的解决方案。
此解决方案帮助我打开其中包含 korean 语言的 csv 文件。谢谢
这很有帮助,谢谢!
H
HimalayanCoder

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

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

我认为 python3 在 sys 模块中没有 setdefaultencoding !
s
shiva

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

使用 Excel:

使用 Excel 打开 csv 文件 Navigate to File 菜单选项并单击 Save As 单击 Browse 选择保存文件的位置 输入预期的文件名 选择 CSV(逗号分隔)(*.csv) 选项 单击工具下拉框并单击 Web 选项下编码选项卡,从将此文档另存为下拉列表中选择选项 Unicode (UTF-8) 保存文件

使用记事本:

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

通过这样做,您应该能够在不遇到 UnicodeCodeError 的情况下 import csv 文件。


这对我有用,而上述解决方案都没有。
D
Deepak Ingole

以下行正在伤害 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() })

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


a
amit haldar

以下片段对我有用。

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

s
shiva

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

utf-8 是默认设置。

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

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

见:docs


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

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

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


R
Rick James

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

请参阅 Trouble with UTF-8 characters; what I see is not what I stored 中的详细信息


P
Paul

我在尝试从 sharepoint 上的 excel 表导入 pandas 数据框时遇到了同样的错误。我的解决方案是使用 engine='openpyxl'。我还使用 requests_negotiate_sspi 来避免以纯文本形式存储密码。

import requests
from io import BytesIO
from requests_negotiate_sspi import HttpNegotiateAuth
cert = r'c:\path_to\saved_certificate.cer'
target_file_url = r'https://share.companydomain.com/sites/Sitename/folder/excel_file.xlsx'
response = requests.get(target_file_url, auth=HttpNegotiateAuth(), verify=cert)
df = pd.read_excel(BytesIO(response.content), engine='openpyxl', sheet_name='Sheet1')

s
shiva

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


M
Madat Sardarli
from io import BytesIO

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

为我工作


bytes_content 来自哪里?
bytes_content 只是一个示例变量,包含对象之类的字节
T
Timus

简单的解决方案:

import pandas as pd

df = pd.read_csv('file_name.csv', engine='python-fwf')

如果它不起作用,请尝试将 engine 更改为 'python''c'