У нас есть пользователи, которым нужна возможность экспортировать данные в CSV, который они открывают в Excel на компьютерах Mac, которые поддерживают символы utf-8.
ПРИМЕЧАНИЕ. Мы не хотим, чтобы нашим пользователям приходилось переходить на вкладку данных, нажимать «Импорт из текста», а затем... Мы хотим, чтобы они могли открывать файл сразу после загрузки и отображать правильную информацию.
Сначала я подумал, что это просто проблема кодирования/декодирования, поскольку мы используем python 2.7 (активно работаем над обновлением до python 3.6), но после того, как это было исправлено, я обнаружил, что причиной проблемы был Excel (поскольку csv работает нормально при открытии в текстовом редакторе или даже в Numbers). Решение, которое я пытаюсь использовать, включает добавление спецификации utf-8 в начало файла, поскольку я где-то читал, что это позволит Excel узнать, что для этого требуется utf-8.
#Here response is just a variable that is valid when used like this and
#we can export CSV's fine that don't need utf-8
writer = csv.writer(response)
writer.writerow("0xEF0xBB0xBF")
Я надеялся, что простое добавление спецификации utf-8 в начало файла csv позволит Excel понять, что при открытии этого файла необходимо использовать кодировку utf-8, но, увы, это не работает. Я не уверен, что это связано с тем, что Excel для MAC не поддерживает это, или я просто неправильно добавил спецификацию.
Редактировать: я не уверен, почему я не упомянул об этом, так как это было важно в решении, но мы используем Django. Я нашел сообщение о переполнении стека это, которое дало решение (которое я включил ниже).





Поскольку мы используем Django, мы смогли просто включить:
response.write('\xEF\xBB\xBF')
перед созданием модуля записи csv и добавлением содержимого в csv.
Еще одна идея, которая, вероятно, привела бы к решению, — открыть файл в обычном режиме, добавить спецификацию, а затем создать модуль записи csv (Примечание: я не проверял эту идею, но если приведенное выше решение не работает для кого-то / они не использую Django, стоит попробовать).
Для лучшего решения рассмотрите возможность использования стороннего модуля unicodecsv, который исправляет проблемы с модулем csv Python 2.7 (Python 3 может обрабатывать строки Unicode), или посмотрите примеры UnicodeReader/UnicodeWriter в файле CSV-документация.
Так как мы скоро портируем на Python 3, нам просто нужно было быстрое исправление до этого времени. Но для других, кто не переходит на Python 3, комментарий Марка, вероятно, является лучшим решением, если они ищут что-то более постоянное/стандартное.
Я нашел веб-сайт это, в котором говорится, что использование кодировки utf-18le является правильным способом, но я также не смог заставить это работать. Я пытался использовать информацию из поста это stackoverflow, но это не работает, потому что
'_csv.writer' object has no attribute 'write', что имеет смысл, но я не знаю, что использовать вместо этого.