问题描述
您的代码段显示x.decode
,但您遇到了 错误-
含义x
已经是Unicode,因此,要对其进行“解码”,必须先将其转换为字节字符串(这是默认编解码器ansi
出现并失败的地方)
。在您的文本中,您说“如果我将ot重写为x。 ”……这似乎意味着您 知道x是Unicode。
那么,您正在做什么- 对unicodex
进行编码以获得字节的编码字符串,或者将一个字节的字符串解码为unicode对象?
我发现不幸的是,您可以调用encode
字节字符串和decode
unicode对象,因为我发现它似乎只会导致用户困惑,但是……至少在这种情况下,您似乎设法传播了困惑(在至少对我来说;-)。
如果看起来x
是unicode,那么您永远都不想“解码”它-您可能希望使用某种编解码器(例如latin-1)对它进行
以获取字节串,如果您需要某种编码的话。 I / O目的(对于您自己的内部程序使用,我建议始终使用unicode -仅在绝对 时或
出于输入/输出目的而 或编码字节字符串的情况下,才进行Unicode编码/解码)。
解决方法
我正在阅读一个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行,我也会遇到相同的错误。