csvwriter遇到UnicodeEncodeError

0 投票
2 回答
5702 浏览
提问于 2025-04-15 16:40

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

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 个回答

1

对于IDLE,根据这里的解决方案(链接),你需要打开文件 $python/Lib/idellib/IOBinding.py,然后在设置地区的try-except-pass模块后面强行添加

encoding = "utf-8"

接着关闭IDLE并保存这个文件(可能需要管理员权限),然后再打开IDLE。对我来说,这样做是有效的。我的IDLE版本是1.2,Python版本是2.5。

6

确实,我的异常处理似乎不起作用。有什么建议吗?

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 解释器。

撰写回答