CSV является простым форматом данных, который обычно используется программным обеспечением для работы с электронными таблицами. Формат описывает набор записей таблицы, в котором каждая ячейка ряда отделена друг от друга запятой (CSV — это аббревиатура для comma-separated values). Например, ниже представлены некоторые данные на "недисциплинированных" пассажиров авиакомпании в формате CSV:
Year,Unruly Airline Passengers
1995,146
1996,184
1997,235
1998,200
1999,226
2000,251
2001,299
2002,273
2003,281
2004,304
2005,203
Замечание
Вышеприведённый пример содержит реальные числа. Они были любезно предоставлены Федеральным Управлением Авиации США. См. http://www.faa.gov/data_statistics/passengers_cargo/unruly_passengers/.
Несмотря на то, что CSV выглядит просто, он не является форматом как таковым. Разные программные продукты создают и используют различные варианты CSV, делая непростым его использование. К счастью, Python поставляется со стандартной библиотекой для работы с CSV.
По причине того, что модуль csv работает как
файлоподобные объекты, его можно использовать вместе с
HttpResponse:
import csv
from django.http import HttpResponse
# Количество недисциплинированных пассажиров за каждый год диапазона 1995 - 2005.
# В реальном приложении эта информация будет получена из базы данных.
UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]
def unruly_passengers_csv(request):
# Создаём объект HttpResponse с соответствующим CSV заголовком.
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=unruly.csv'
# Создаём объект для записи CSV, используя HttpResponse как "файл"
writer = csv.writer(response)
writer.writerow(['Year', 'Unruly Airline Passengers'])
for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):
writer.writerow([year, num])
return response
Код и комментарии должны быть достаточно очевидными, но некоторые моменты требует особого упоминания:
Отклик имеет отличный от text/html MIME-тип — text/csv. Это указывает браузерам, что передаваемый документ является CSV файлом.
Отклик получает дополнительный заголовок «Content-Disposition», который содержит имя CSV файла. Этот заголовок, а точнее часть вложения, указывает браузеру, что необходимо запросить у пользователя место куда надо сохранить файл, а не отображать его на экране. Имя файла может быть произвольным, назовите его как пожелаете с помощью диалогового окна «Сохранить как ...».
Подключение к API генерации CSV несложно: просто передайте response в качестве первого аргумента для
csv.writer. Функцияcsv.writerожидает файлоподобный объект и объектыHttpResponseсоответствуют этому требованию.Для каждой записи в вашем CSV файле требуется вызывать функцию
writer.writerow, передавая ей итерационный объект, подобный списку или кортежу.Модуль csv заботится об экранировании данных. Просто передавайте информацию в функцию
writerow()и она сделает всё правильно.
Это основной шаблон поведения в случае когда вам требуется
вернуть информацию отличную от HTML: создайте объект
HttpResponse (с определённым MIME-типом),
передайте его чему-нибудь, ожидающему файл и затем возвратите
отклик.
Давайте рассмотрим ещё несколько примеров.
| Пред. | Уровень выше | След. |
| Глава 11. Генерация данных, отличных от HTML | Начало | Генерация PDF |
0 comments | Make a comment