UnicodeEncodeError:'ascii'编解码器无法编码字符u'\ xa3'

发布于 2021-01-29 15:19:29

我正在阅读一个Excel电子表格,其中包含一些£符号。

当我尝试使用xlrd模块读取它时,出现以下错误:

x = table.cell_value(row, col)
x = x.decode("ISO-8859-1")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 0: ordinal not in range(128)

如果我将其重写为x.encode(’utf-8’),它将停止引发错误,但是不幸的是,当我随后将数据写到其他地方(如latin-1)时,£符号都变成了乱码。

我该如何解决这个问题,并正确阅读英镑符号?

-更新-

某些读者建议我根本不需要对其进行解码,或者在需要时可以将其编码为Latin-1。问题在于,我最终需要将数据写入CSV文件,并且它似乎反对原始字符串。

如果我根本不编码或解码数据,那么会发生这种情况(将字符串添加到名为items的数组之后):

for item in items:
    #item = [x.encode('latin-1') for x in item]
    cleancsv.writerow(item)
File "clean_up_barnet.py", line 104, in <module>
 cleancsv.writerow(item)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 43: ordinal not in range(128)

即使我取消注释Latin-1行,我也会遇到相同的错误。

关注者
0
被浏览
231
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您的代码段显示x.decode,但您遇到了 编码 错误-
    含义x已经是Unicode,因此,要对其进行“解码”,必须先将其转换为字节字符串(这是默认编解码器ansi出现并失败的地方)
    。在您的文本中,您说“如果我将ot重写为x。 编码 ”……这似乎意味着您 确实 知道x是Unicode。

    那么,您正在做什么- 意味着 对unicodex进行编码以获得字节的编码字符串,或者将一个字节的字符串解码为unicode对象?

    我发现不幸的是,您可以调用encode字节字符串和decodeunicode对象,因为我发现它似乎只会导致用户困惑,但是……至少在这种情况下,您似乎设法传播了困惑(在至少对我来说;-)。

    如果看起来x是unicode,那么您永远都不想“解码”它-您可能希望使用某种编解码器(例如latin-1)对它进行 编码
    以获取字节串,如果您需要某种编码的话。 I / O目的(对于您自己的内部程序使用,我建议始终使用unicode -仅在绝对 必要 时或
    出于输入/输出目的而 接收 或编码字节字符串的情况下,才进行Unicode编码/解码)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看