Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

Генерация 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 соответствуют этому требованию.

  • Для каждой записи в вашем CVS файле требуется вызывать функцию writer.writerow, передавая ей итерационный объект, подобный списку или кортежу.

  • Модуль csv заботится об экранировании данных. Просто передавайте информацию в функцию writerow() и она сделает всё правильно.

Это основной шаблон поведения в случае когда вам требуется вернуть информацию отличную от HTML: создайте объект HttpResponse (с определённым MIME-типом), передайте его чему-нибудь, ожидающему файл и затем возвратите отклик.

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


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

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

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID