如何排序DictWriter的标题(不是字母)?

时间:2019-05-24 15:21:25

标签: python csv export-to-csv

我正在尝试将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 :(得分:0)

影响顺序的不是DictWriter类,而是headers来自对dict的迭代:headers = [x for x in data[0]]的事实。当您在3.7之前的Python版本中迭代dict时,会以任意顺序获得密钥。

您的选项是切换到3.7,如果可以确定headers列表的顺序,或者可以在数据收集函数中使用OrderedDict来维护列表,订购钥匙。或调整您的intents_to_csv函数以获取预定的headers列表并将其建立在您的数据收集函数中。

在3.7上,该语言要求迭代匹配插入顺序,因此您只能在该版本中使用常规dict实例。标准的3.6 C实现还维护插入顺序,但这是实现的详细信息,因此不应依赖。