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

2025-01-07 08:44:00
admin
原创
144
摘要:问题描述:我正在使用Python-2.6 CGI脚本,但在执行时在服务器日志中发现此错误json.dumps(),Traceback (most recent call last): File "/etc/mongodb/server/cgi-bin/getstats.py", lin...

问题描述:

我正在使用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()函数返回一个字典。

在发布此问题之前,我在 SO 上阅读了此问题。我该如何解决此错误?


解决方案 1:

如果在尝试读取 csv 文件时出现此错误,则可以使用read_csv()以下函数pandas设置编码:

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

解决方案 2:

默认情况下,open 函数具有 io 属性“r”,表示只读。可以将其设置为“rb”,表示读取二进制。

尝试下面的代码片段:

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

解决方案 3:

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

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

解决方案 4:

ascii您的字符串中有一个非编码字符。

如果您需要在代码中使用其他编码,则可能无法解码utf-8。例如:

>>> 'my weird character x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:Python27libencodings/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

解决方案 5:

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

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

解决方案 6:

这个解决方案对我有用:

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

解决方案 7:

受到@aaronpenne 和@Soumyaansh 的启发

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

解决方案 8:

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

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

解决方案 9:

简单的解决方案:

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

解决方案 10:

从 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'))

解决方案 11:

如果上述方法对您不起作用,您可能需要研究更改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

解决方案 12:

以下代码片段对我有用。

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

解决方案 13:

以下代码损害了 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() })

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

解决方案 14:

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

utf-8是默认设置。

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

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

参见:文档

解决方案 15:

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

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

解决方案 16:

问题很简单:一些非 ASCII 文本被编码为字节,其编码方式与你使用的编码方式不同。(当然,如果你没有“特殊字符”,字符集就没那么重要了)

例子:

my_text = "Temp in °"
my_encoded_text = bytes(my_text,'iso-8859-1')
my_encoded_text.decode('utf-8')

这将引发错误:

UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 8 处的字节 0xb0: 无效的起始字节

而如果你使用相同的字符集来解码它

my_text = "Temp in °"
my_encoded_text = bytes(my_text,'iso-8859-1')
my_encoded_text.decode('iso-8859-1')

'温度(°)'

如果您不知道用于执行编码的字符集,并且正在处理文件,那么您可以使用“chardet”(先安装它,眨眼,眨眼)。

import chardet
file_name = 'the_file_you_want_to_read.csv'
with open(file_name, 'rb') as f:
    result = chardet.detect(f.read())

detected_charset = result['encoding']

您可以使用detected_charset来解码文件。

解决方案 17:

您不需要寻找解码 a5(日元¥)或 96(en-dash )的方法,而是告诉 MySQL 您的客户端编码为“latin1”,但您希望数据库中使用“utf8”。

请参阅UTF-8 字符问题;我看到的不是我存储的

解决方案 18:

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

import requests
from io import BytesIO
from requests_negotiate_sspi import HttpNegotiateAuth
cert = r'c:path_tosaved_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')

解决方案 19:

简单的解决方案:

import pandas as pd

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

如果不起作用请尝试更改engine'python''c'

解决方案 20:

就我而言,我必须将文件保存为带有 BOM 的 UTF8,这样UTF8 utf8这个错误才消失。

解决方案 21:

我知道这与问题不直接相关,但是当我在谷歌上搜索错误信息时,我反复被引导到这个问题。

当我错误地尝试安装 Python 包(就像从文件安装要求一样)时,确实出现了错误,例如-r

# wrong: leads to the error above
pip install -r my_package.whl

# correct: without -r
pip install my_package.whl

我希望这能帮助那些和我一样在不经意间犯了同样小错误的人。

解决方案 22:

这里有很多答案建议使用一种编码或另一种编码来消除错误。我认为你真的不应该这么做。例如,如果你尝试使用 pandas 等将 CSV 文件加载到内存中,那么使用latin1或之类的编码unicode_escape将消除错误,但会为产生错误的实际行产生乱码,你只会默默地丢失数据。

如果您收到此错误并且您完全知道问题与编码有关,那么解决方案就是找出正确的编码;例如,数据集通常伴随着另一个元数据词典;网页在其标题等中包含其编码,或者只是询问准备数据的人等。

但是,错误也可能表示您尝试的操作不应该执行。例如,如果您尝试解码以字节对象形式读取的图像文件,则会在标题中抛出错误,但实际上,您永远不应该这样做。

with open("myimage.png", "rb") as f:
    data = f.read()

data.decode()  # UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte

您可能首先想将图像读入数字数组,因此解决方案是使用专用的图像读取器模块并将数据转换为数组,而无需解码字节的中间过程。

from PIL import Image
import numpy as np
data = np.array(Image.open("myimage.png"))

解决方案 23:

此链接解决了我的问题。使用 utf-8 重新保存文件。1

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用