Каковы хорошие способы загрузки больших объемов данных .csv в веб-приложение, используя Django / Python? - PullRequest
2 голосов
/ 25 февраля 2009

У меня есть очень простой модуль загрузки файлов CSV, который позволяет массово загружать данные моего пользователя на мой сайт. Я обрабатываю CSV-файл в бэкэнде с помощью скрипта Python, который выполняется на crontab, а затем отправляю пользователю по электронной почте результаты массовой загрузки. Этот процесс работает нормально, но моя проблема с форматом файла CSV.

Существуют ли хорошие инструменты или даже основные правила о том, как принимать различные форматы файла CSV? У пользователя может быть другой порядок столбцов данных, немного другие имена для заголовков столбцов (я хочу, чтобы столбец электронной почты имел название «Электронная почта», но он мог сказать «Основной адрес электронной почты», «Адрес электронной почты»), или отсутствующие дополнительные данные колонны. Какие-нибудь хорошие примеры функциональности загрузки CSV, которая является очень разрешающей и удобной для пользователя?

Кроме того, как мне сказать пользователю экспортировать данные в формате CSV? Я импортирую информацию из адресной книги, поэтому эти данные часто поступают из Outlook, Thunderbird и других программных пакетов с адресными книгами. Есть ли другие популярные форматы данных, которые мне следует принять?

Ответы [ 6 ]

4 голосов
/ 25 февраля 2009

Я бы проверил встроенный модуль Python CSV. Откровенно говоря, .replace () в вашей первой строке должен охватывать проблему с синонимами, и если вы используете csv.DictReader , вы сможете очень легко справиться с отсутствующими столбцами:

my_dict_reader = csv.DictReader(somecsvfile)
for row in my_dict_reader:
    SomeDBModel.address2=row.get('address2', None)

при условии, что вы хотите сохранить значение None для пропущенных полей.

3 голосов
/ 25 февраля 2009

Вы должны заставить первую строку быть заголовками, заставить пользователя сопоставлять свои заголовки с именами ваших полей на следующей странице и запомнить это отображение для своих будущих дампов.

Всякий раз, когда я делаю CSV-импорт, данные действительно поступают из электронной таблицы Excel. Мне удалось сэкономить время с помощью pyexcelerator для непосредственного импорта .xls. Мой код .csv или .xls - это генератор, который выдает {'field_name':'data', ...} словари, которые можно назначать объектам модели.

Если вы делаете адресные данные, вы должны принять vCard .

1 голос
/ 26 февраля 2009

Посмотрите на csv модуль из stdlib. Он содержит предустановки для popualr CSV-диалектов, как например, производства Excel.

Отображение полей поддержки класса Reader, и если файл содержит заголовок столбца, это не зависит от порядка столбцов. Для более сложной логики, такой как поиск нескольких альтернативных имен для поля, вам нужно написать собственную реализацию.

1 голос
/ 25 февраля 2009

Если вы скопируете таблицу Excel в буфер обмена, а затем вставите результаты в блокнот, вы заметите, что она разделена табуляцией. Однажды я использовал его для массового импорта из большинства редакторов таблиц путем копирования данных из редактора в текстовую область на html-странице.

Вы можете использовать фон для textarea в качестве подсказки для количества столбцов и размещать свои заголовки сверху, предлагая порядок для пользователя.

Javascript будет обрабатывать вставленные данные и немедленно отображать их пользователю с простой предварительной проверкой, что позволяет легко исправить ошибку и выполнить ее повторную установку.

Затем нажимается кнопка импорта, данные снова проверяются и отображаются результаты импорта. К сожалению, я никогда не слышал отзывов о том, было ли это легко использовать или нет.

Во всяком случае, я все еще вижу это как вариант при реализации массового импорта.

1 голос
/ 25 февраля 2009

Взгляните на этот проект: django-batchimport

Это может быть излишним для вас, но все же может дать вам несколько хороших идей по улучшению вашего собственного кода.

Редактировать: также игнорируйте, что он использует только xlrd для импорта Excel. Основные понятия одинаковы, просто вы будете использовать модуль csv вместо xlrd.

1 голос
/ 25 февраля 2009

Я бы обработал случайное сопоставление заголовков столбцов в вашем скрипте после его загрузки. Трудно сделать «поймать все», что бы обрабатывать все, что пользователи могут ввести. Я хотел бы, чтобы он развивался по мере вашего продвижения и медленно создавал список отношений один-один на основе того, что загружает ваш пользователь.

Или!

Проверьте заголовки столбцов и убедитесь, что они правильно отформатированы, и посоветуйте им, как это исправить, если это не так.

"Основной адрес электронной почты" не распознан, наш Схема «Электронная почта», «Адрес», «Телефон», и т.д.

Вы также можете принять XML, и это позволит вам создать собственную схему, которой они должны будут придерживаться. Посмотрите этот урок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...