Python: конвертировать Unicode в ASCII без ошибок для файла CSV

Я читал все вопросы относительно преобразования из Unicode в CSV в Python здесь, в StackOverflow, и я все еще теряюсь. Каждый раз, когда я получаю «кодек UnicodeEncodeError: 'ascii', он не может кодировать символ u '\ xd1' в позиции 12: порядковый номер не в диапазоне (128)"

buffer=cStringIO.StringIO() writer=csv.writer(buffer, csv.excel) cr.execute(query, query_param) while (1): row = cr.fetchone() writer.writerow([s.encode('ascii','ignore') for s in row]) 

Значение строки равно

 (56, u"LIMPIADOR BA\xd1O 1'5 L") 

где значение \ xd10 в базе данных – это, с диакритической тильдой, используемой на испанском языке. Сначала я попытался преобразовать значение в нечто действительное в ascii, но после того, как я потерял столько времени, я пытаюсь игнорировать эти символы (я полагаю, у меня была бы такая же проблема с акцентированными гласными).

Я хотел бы сохранить значение в CSV, желательно с помощью «LIMPIADOR BAÑO 1'5 L»), но если это невозможно, по крайней мере, вы сможете его сохранить («LIMPIADOR BAO 1'5 L»).

One Solution collect form web for “Python: конвертировать Unicode в ASCII без ошибок для файла CSV”

Правильно, – не является допустимым символом ASCII, поэтому вы не можете кодировать его в ASCII. Таким образом, вы можете, как ваш код сделать выше, игнорировать их. Другой способ, чтобы удалить акценты, вы можете найти здесь: Каков наилучший способ удаления акцентов в строке юникода Python?

Но обратите внимание, что обе методики могут привести к плохим эффектам, например, сделать слова на самом деле означают что-то другое и т. Д. Поэтому лучше всего держать акценты. И тогда вы не можете использовать ASCII, но вы можете использовать другую кодировку. UTF-8 – это безопасная ставка. Latin-1 или ISO-88591-1 является общим, но включает только западноевропейских персонажей. CP-1252 распространен в Windows и т. Д. И т. Д.

Поэтому просто переключите «ascii» на любую кодировку, которую вы хотите.


Ваш фактический код, согласно вашему комментарию:

 writer.writerow([s.encode('utf8') if type(s) is unicode else s for s in row]) 

где

 row = (56, u"LIMPIADOR BA\xd1O 1'5 L") 

Теперь я считаю, что это должно работать, но, видимо, этого не происходит. Я думаю, что unicode все равно пропускается в cvs writer. Разверните эту длинную линию на ее части:

 col1, col2 = row # Use the names of what is actually there instead row = col1, col2.encode('utf8') writer.writerow(row) 

Теперь ваша реальная ошибка не будет скрыта из-за того, что вы все придерживаетесь в одной строке. Этого также можно было бы избежать, если бы вы включили надлежащую трассировку.

  • Быстрый способ фильтрации незаконных символов xml unicode в python?
  • Декодирование Unicode в Python
  • Преобразование строк, таких как \\ uXXXX в python
  • Как юникод представлен внутри Python?
  • Поддерживает ли Python 2.5.2 Unicode для lower () и upper ()?
  • Обнаружение символов не-ascii в строке unicode
  • Усечение строки до байтовой длины в Python
  • UnicodeEncodeError только при работе в качестве задания cron
  • Python - лучший язык программирования в мире.