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", line 135, in <module>
print json.dumps(__getdata())
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()
函数返回一个字典。
在发布此问题之前,我在 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 byte
并invalid continuation byte
输入错误。添加后errors='ignore'
问题就解决了。
with open(out_file, 'rb') as f:
for line in f:
print(line.decode(errors='ignore'))
解决方案 11:
如果上述方法对您不起作用,您可能需要研究更改encoding
其csv file
本身。
使用 Excel:
使用以下方式打开
csv
文件Excel
导航至文件菜单选项并单击另存为
单击“浏览”选择保存文件的位置
输入所需文件名
选择
CSV (Comma delimited) (*.csv)
选项单击工具下拉框,然后单击Web 选项
在“编码”选项卡下,
Unicode (UTF-8)
从“将此文档另存为”下拉列表中选择选项保存文件
使用记事本:
csv file
使用记事本打开导航至文件>另存为选项
接下来,选择文件的位置
选择保存类型选项为所有文件(.)
.csv
指定带扩展名的文件名从编码下拉列表中,选择
UTF-8
选项。单击“保存”保存文件
通过这样做,您应该能够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