2009-12-04 57 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。