Хостинг Django от «Джино»
Table of contents

Генерация CSV

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-типом), передайте его чему-нибудь, ожидающему файл и затем возвратите отклик.

Давайте рассмотрим ещё несколько примеров.


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5