Как заказать заголовки для DictWriter (не по алфавиту)? - PullRequest
0 голосов
/ 24 мая 2019

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

Если бы я указывал headers = ["Apples", "Bananas", "Oranges"] и следовал за этим, w = csv.DictWriter(response, fieldnames=headers()) и w.writeheader(), я бы получил заголовки в указанном порядке, но я не могу этого сделать, потому что я использую его для нескольких файлов которым нужны разные заголовки.

Вот мой код:

# CSV function
def intents_to_csv(data, file_name, *args, **kwargs):

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=".{}.csv"'.format(file_name)
    w1 = csv.writer(response, delimiter=',')

    headers = [x for x in data[0]]
    w = csv.DictWriter(response, fieldnames=headers) # writing the csv data to a response object.
    w.writeheader()
    w.writerows(data)
    return response

Пример сбора данных для функции:

student_intents = []
for intent in fall_info:
        data = {}
        data["Employee"] = intent.employee
        data["Position"] = intent.position
        data["Cross Train"] = intent.cross_train
        data["Shirtsize"] = intent.shirtsize()
        data["Email"] = intent.employee.email
        data["Phone #"] = intent.employee.phone
        data["Date Created"] = intent.date_created.date()
        student_intents.append(data)
return intents_to_csv(student_intents, file_name)

Когда я запускаю print(headers), они печатают в следующем порядке:

['Email', 'Position', 'Employee', 'Cross Train', 'Shirtsize', 'Phone #', 'Date Created']

РЕДАКТИРОВАТЬ: Похоже, что здесь просто перевернуты «Электронная почта» и «Сотрудник», но это еще более перемешано для различной информации с большим количеством заголовков.

1 Ответ

0 голосов
/ 24 мая 2019

На порядок влияет не класс DictWriter, а тот факт, что headers исходит из итерации по dict: headers = [x for x in data[0]].Когда вы перебираете dict в версии Python до 3.7, вы получаете ключи в произвольном порядке.

Вы можете переключиться на 3.7, чтобы отсортировать список headers в нужныйпорядок, если это можно определить, или использовать OrderedDict в функции сбора данных для поддержания порядка добавления ключей.Или настройте свою функцию intents_to_csv, чтобы взять заранее определенный список headers и встроить его в свои функции сбора данных.

В 3.7 для языка требуется, чтобы итерация соответствовала порядку вставки, поэтому вы можете просто использовать обычный dict экземпляры в этой версии.Стандартная реализация 3.6C также поддерживает порядок вставки, но это деталь реализации, на которую не следует полагаться.

...