带有csvwriter的UnicodeEncodeError

时间:2009-12-04 00:07:25

标签: python

我还有一个错误需要修复。

row = OpenThisLink + titleTag + JD
        try:
             csvwriter.writerow([row])
        except (UnicodeEncodeError, UnicodeDecodeError):
             pass

这给出了错误(对于这个字符:“ń”)

row = OpenThisLink + str(titleTag) + JD
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 51: ordinal not in range(128)

我尝试使用here方法解决此问题。但是,

>>> title = "hello Giliciński"
Unsupported characters in input
u = unicode(title, "latin1")

Traceback (most recent call last):
   File "<pyshell#56>", line 1, in <module>
     u = unicode(title, "latin1")
NameError: name 'title' is not defined
>>> title = "ń" Unsupported characters in input

根据文件:

  

UnicodeEncodeError的类似案例不同,不能总是避免这种失败。

事实上,我的例外似乎不起作用。有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

  

事实上,我的例外似乎并非如此   上班。有什么建议吗?

row = OpenThisLink + titleTag + JD在try / except块之外,因此在该语句运行时引发的任何异常都不会被捕获。然而,这将抓住例外:

try:
    row = OpenThisLink + titleTag + JD
    csvwriter.writerow([row])
except (UnicodeEncodeError, UnicodeDecodeError):
    print "Caught unicode error"

但是,在您发布的代码中,如果row = OpenThisLink + titleTag + JD包含unicode字符串,titleTag将不会引发UnicodeEncodeError;字符串连接的结果将是unicode类型。

现在,csv模块不支持unicode,因此当您使用unicode数据调用writerow()时,这将引发UnicodeEncodeError。您需要将unicode字符串编码为合适的编码(UTF8最好),然后将其传递给writerow(),例如:

>>> titleTag = "hello Giliciński"
>>> titleTag
'hello Gilici\xc5\x84ski'
>>> type(titleTag)
<type 'str'>
>>>
>>> titleTag = titleTag.decode('utf8')
>>> titleTag
u'hello Gilici\u0144ski'
>>> type(titleTag)
<type 'unicode'>
>>>
>>> csvwriter.writerow([titleTag])
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0144' in position 12: ordinal not in range(128)
>>>
>>> # but this will work...
>>> csvwriter.writerow([titleTag.encode('utf8')])

相关的Python文档是here。请务必查看examples,尤其是最后一个。

BTW,pyshell似乎不接受非ascii字符作为输入,所以请使用普通的Python解释器。

答案 1 :(得分:1)

对于IDLE,根据此处的解决方案(link),打开文件$ python / lib / idellib / IOBinding.py,强行放入

  

encoding =“utf-8”

用于设置语言环境的try-except-pass模块之后。关闭IDLE并保存文件(可能需要管理优先级)并再次打开IDLE。至少它对我有用。我的IDLE版本是1.2,python:2.5。