Кодирование данных смешанного типа?

#python

#python

Вопрос:

У меня есть массив следующего вида:

 row = [u'Arun DC', 4.0, 34.0, 76.0, 223.52941176470588, u'yes', 0.0, '', '', '', '', u'yes', '', u'yes', u'yes', u'yes', u'no', u'xa37.50 - xa310 not clear what this is for', u'xa37.50 - xa310 not clear what this is for', '', u'xa37.50 - xa310 not clear what this is for', u'xa37.50 - xa310 not clear what this is for', '', '', '', '', u'no water on sites', '', u'1st years rent free', '']
  

Я хочу записать это в файл CSV, но я получаю следующую ошибку:

 writer.writerow(row)
UnicodeEncodeError: 'ascii' codec can't encode character u'xa3' in position 0: ordinal not in range(128)
  

Итак, я попытался сначала их закодировать, но это выдает ошибку, потому что я не могу закодировать элементы с плавающей запятой:

 writer.writerow([i.encode('latin-1') for i in row])
AttributeError: 'int' object has no attribute 'encode'
  

Есть мысли о том, как аккуратно обойти это?

Ответ №1:

 [x.encode('latin-1') if isinstance(x, unicode) else x
 for x in row]
  

Ответ №2:

 [i.encode('latin-1') if isinstance(i, unicode) else i for i in row]
  

Комментарии:

1. да, но это полностью отфильтровывает числа.

2. Хороший момент, обновлено для использования троичного if, а не для понимания списка.

3. Теперь у нас есть 2 ответа, которые отличаются друг от друга одним именем переменной.

Ответ №3:

 [('%s'%a).encode('latin-1') for a in row]
  

возвращает список строк. Вы могли бы использовать его для записи в CSV.