2009-12-04 61 views
0

我又多了一个错误需要修正。UnicodeEncodeError与csvwriter

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

这给出了错误(此字符: “N”)我试图通过使用该方法here来解决这个

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,这样的失败未必能够避免。

事实上,我的例外似乎并没有工作。有什么建议么?

谢谢!

+0

链接到文档:http://wiki.python.org/moin/UnicodeDecodeError – Zeynel 2009-12-04 00:08:06

回答

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不会提高UnicodeEncodeError如果titleTag包含unicode字符串的代码;字符串连接的结果将是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 interpretter。

1

对于IDLE,根据这里的溶液(link),打开文件$蟒/ LIB/idellib/IOBinding.py,有力地把

编码= “UTF-8”

在用于设置区域设置的try-except-pass模块之后。关闭空闲并保存文件(可能需要管理优先级)和开放再次空闲。至少它适合我。我的空闲版本是1.2,python:2.5。