Экспорт CSV для открытия в формате utf-8 в Excel на MAC с использованием Python 2.7

У нас есть пользователи, которым нужна возможность экспортировать данные в 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. Я нашел сообщение о переполнении стека это, которое дало решение (которое я включил ниже).

Я нашел веб-сайт это, в котором говорится, что использование кодировки utf-18le является правильным способом, но я также не смог заставить это работать. Я пытался использовать информацию из поста это stackoverflow, но это не работает, потому что '_csv.writer' object has no attribute 'write', что имеет смысл, но я не знаю, что использовать вместо этого.

Poe Warner 18.06.2019 23:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
280
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку мы используем Django, мы смогли просто включить:

response.write('\xEF\xBB\xBF')

перед созданием модуля записи csv и добавлением содержимого в csv.

Еще одна идея, которая, вероятно, привела бы к решению, — открыть файл в обычном режиме, добавить спецификацию, а затем создать модуль записи csv (Примечание: я не проверял эту идею, но если приведенное выше решение не работает для кого-то / они не использую Django, стоит попробовать).

Для лучшего решения рассмотрите возможность использования стороннего модуля unicodecsv, который исправляет проблемы с модулем csv Python 2.7 (Python 3 может обрабатывать строки Unicode), или посмотрите примеры UnicodeReader/UnicodeWriter в файле CSV-документация.

Mark Tolonen 18.07.2019 04:13

Так как мы скоро портируем на Python 3, нам просто нужно было быстрое исправление до этого времени. Но для других, кто не переходит на Python 3, комментарий Марка, вероятно, является лучшим решением, если они ищут что-то более постоянное/стандартное.

Poe Warner 19.07.2019 21:32

Другие вопросы по теме