我正在尝试将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']
编辑:这里似乎只是“电子邮件”和“员工”,但是对于带有更多标题的不同信息,它显得更加混乱。
答案 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实现还维护插入顺序,但这是实现的详细信息,因此不应依赖。