2009-12-04 2 views
0

У меня есть еще одна ошибка для исправления.UnicodeEncodeError с csvwriter

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

Это дает ошибку (для этого персонажа: "N")

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

Ссылка на документацию: http://wiki.python.org/moin/UnicodeDecodeError – Zeynel

ответ

5

И действительно, мое исключение не выглядит для работы. Какие-либо предложения?

находится за пределами блока 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, поэтому, когда вы вызываете writerow() с данными в unicode, это вызовет UnicodeEncodeError. Вы должны кодировать строки Юникода в подходящую кодировку (UTF-8 будет лучше), а затем передать, что 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, кажется, не принимает символы non-ascii в качестве входных данных, поэтому используйте обычный интерпретатор Python.

1

Для IDLE, в соответствии с решением здесь (link), открыть файл $ питона/Lib/idellib/IOBinding.py, решительно положил

кодирование = "UTF-8"

после модуля try-except-pass для установки языкового стандарта. Закрыть IDLE и сохранить файл (возможно, требуется административный приоритет) и снова открыть IDLE. По крайней мере, это работает для меня. Моя версия IDLE 1.2, python: 2.5.

Смежные вопросы