UnicodeDecodeError,无效的连续字节

时间:2011-04-05 13:23:41

标签: python unicode decode

为什么以下项目失败?为什么它会成功使用“latin-1”编解码器?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.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 0xe9 in position 10: invalid continuation byte

11 个答案:

答案 0 :(得分:203)

在二进制文件中,0xE9看起来像1110 1001。如果您阅读UTF-8 on Wikipedia,则会看到此类字节后面必须跟两个10xx xxxx形式。所以,例如:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

但这只是异常的机械原因。在这种情况下,你有一个几乎可以肯定用拉丁文1编码的字符串。你可以看到UTF-8和拉丁文1看起来有什么不同:

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(注意,我在这里混合使用Python 2和3表示。输入在任何Python版本中都有效,但是你的Python解释器不太可能以这种方式实际显示unicode和byte字符串。)< / p>

答案 1 :(得分:155)

当我尝试通过pandas read_csv方法打开csv文件时出现了同样的错误。

解决方案是将编码更改为&#39; latin-1&#39;:

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')

答案 2 :(得分:55)

无效的UTF-8。该字符是ISO-Latin1中的e-acute字符,这就是为什么它成功使用该代码集。

如果你不知道你收到字符串的代码集,那你就有点麻烦了。如果为您的协议/应用程序选择一个代码集(希望是UTF-8),然后您只是拒绝那些没有解码的代码集,那将是最好的。

如果你不能这样做,你需要启发式。

答案 3 :(得分:39)

因为UTF-8是多字节的,并且没有与\xe9加上以下空格的组合相对应的字符。

为什么要在两者 utf-8和latin-1中取得成功?

这里的句子应该是如何用utf-8:

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'

答案 4 :(得分:10)

utf-8代码错误通常是在数值范围超过0到127时出现的。

引发此异常的原因是:

1)如果代码点小于<128,则每个字节与代码点的值相同。 2)如果代码点为128或更大,则无法使用此编码表示Unicode字符串。 (在这种情况下,Python会引发UnicodeEncodeError异常。)

为了克服这一问题,我们提供了一组编码,使用最广泛的是“ Latin-1,也称为ISO-8859-1”

因此,ISO-8859-1 Unicode点0–255与Latin-1值相同,因此,要转换为这种编码,只需要将代码点转换为字节值即可;如果遇到大于255的代码点,则无法将字符串编码为Latin-1

当您尝试加载数据集时发生此异常时,请尝试使用此格式

df=pd.read_csv("top50.csv",encoding='ISO-8859-1')

在语法末尾添加编码技术,然后接受该技术以加载数据集。

答案 5 :(得分:10)

使用它,如果它显示UTF-8错误

pd.read_csv('File_name.csv',encoding='latin-1')

答案 6 :(得分:4)

如果在处理刚刚打开的文件时出现此错误,请检查是否以'rb'模式打开了文件

答案 7 :(得分:4)

当您正在输入熊猫中的特定文件或数据时,会出现这种类型的错误,例如:-

data=pd.read_csv('/kaggle/input/fertilizers-by-product-fao/FertilizersProduct.csv)

然后错误显示如下:- UnicodeDecodeError:“ utf-8”编解码器无法解码位置1的字节0xf4:无效的继续字节

为避免此类错误,可以通过添加参数来消除

data=pd.read_csv('/kaggle/input/fertilizers-by-product-fao/FertilizersProduct.csv', encoding='ISO-8859-1')

答案 8 :(得分:0)

在我从.txt文件中读取包含希伯来语的文本时,这也发生在我身上。

我点击了file -> save as,并将此文件保存为UTF-8编码

答案 9 :(得分:0)

解决方案改为“UTF-8 sin BOM”

答案 10 :(得分:-1)

在这种情况下,我试图执行一个.py来激活路径/file.sql。

我的解决方案是将file.sql的编码修改为“不带BOM的UTF-8”,并且可以!

您可以使用Notepad ++做到这一点。

我将保留部分代码。

/ 代码 /

con = psycopg2.connect(host = sys.argv [1], 端口= sys.argv [2],dbname = sys.argv [3],用户= sys.argv [4],密码= sys.argv [5])

cursor = con.cursor() sqlfile = open(路径,'r')