csvwriter遇到UnicodeEncodeError
我还有一个错误需要修复。
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)
我试着通过使用这里的方法来解决这个问题。但是,
>>> 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 个回答
对于IDLE,根据这里的解决方案(链接),你需要打开文件 $python/Lib/idellib/IOBinding.py,然后在设置地区的try-except-pass模块后面强行添加
encoding = "utf-8"
接着关闭IDLE并保存这个文件(可能需要管理员权限),然后再打开IDLE。对我来说,这样做是有效的。我的IDLE版本是1.2,Python版本是2.5。
确实,我的异常处理似乎不起作用。有什么建议吗?
row = OpenThisLink + titleTag + JD
这行代码在 try/except 块之外,所以当这行代码运行时,如果出现异常,它是不会被捕捉到的。不过,下面的代码可以捕捉到异常:
try:
row = OpenThisLink + titleTag + JD
csvwriter.writerow([row])
except (UnicodeEncodeError, UnicodeDecodeError):
print "Caught unicode error"
但是,在你发布的代码中,如果 titleTag
包含一个 Unicode 字符串,row = OpenThisLink + titleTag + JD
不会引发 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 文档可以在 这里 找到。一定要看看 示例,特别是最后一个。
顺便说一下,pyshell
似乎不接受非 ASCII 字符作为输入,所以请使用普通的 Python 解释器。