#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.