我还有一个错误需要修复。
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
的类似案例不同,不能总是避免这种失败。
事实上,我的例外似乎不起作用。有什么建议吗?
谢谢!
答案 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。