UnicodeEncodeError с csvwriter - PullRequest
       24

UnicodeEncodeError с csvwriter

0 голосов
/ 04 декабря 2009

У меня есть еще одна ошибка, чтобы исправить.

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 ]

5 голосов
/ 04 декабря 2009

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

row = OpenThisLink + titleTag + JD находится вне блока try / исключением, поэтому любые исключения, возникшие во время выполнения этого оператора, не будут перехвачены. Это, однако, поймает исключение:

try:
    row = OpenThisLink + titleTag + JD
    csvwriter.writerow([row])
except (UnicodeEncodeError, UnicodeDecodeError):
    print "Caught unicode error"

Но в опубликованном вами коде row = OpenThisLink + titleTag + JD не вызовет UnicodeEncodeError, если titleTag содержит строку в юникоде; результат конкатенации строк будет иметь тип unicode.

Теперь модуль csv не поддерживает Unicode, поэтому при вызове writerow() с данными Unicode это вызовет 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.

1 голос
/ 27 марта 2011

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

encoding = "utf-8"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...