我正在努力改进一些心理测试的开源代码。 对于数据输出,我使用的是python的CSV模块,它本身工作正常。数据输出取决于Django模型(试验)和相应的数据库条目,我想将来自另一个模型(参与者)的数据添加到CSV。到目前为止,我只设法在新行中添加所需的条目,但这基本上使CSV无法用于统计程序中的进一步使用。 简而言之,我得到了:
headers of database entry 1
headers of database entry 2
values of database entry 1
values of database entry 2
但我想要的是输出看起来像这样:
headers of database entry 1 followed by 2
values of database entry 1 followed by 2
这是出口的重要部分。
def export_as_csv(modeladmin, request, queryset):
headers, fields = zip(*export_info_trial)
headers_participant, fields_participant = zip(*export_info_participant)
zipFile = ZipFile(in_memory, 'w')
for participant in queryset:
rows = [headers_participant] + [headers]
participants = Participant.objects.filter(id=participant.id)
trials = Trial.objects.filter(participant=participant.id)
for participant_value_list in participants.values_list(*fields_participant):
rows.append([unicode(v) for v in participant_value_list])
for trial_value_list in trials.values_list(*fields):
rows.append([unicode(v) for v in trial_value_list])
我确实理解现在的输出是由于我调用rows.append两次但现在我没有任何想法如何巧妙地(或者根本)将这两个调用组合起来。
编辑: 作者被称为如下:
f = StringIO()
writer = UnicodeWriter(f)
for row in rows:
writer.writerow(row)
我还添加了上面函数的前一部分。
我感谢大家的帮助!
答案 0 :(得分:0)
您可以使用python CSV的csv.writer的 writerow ,如下所示:
def export_as_csv(modeladmin, request, queryset):
headers, fields = zip(*export_info_trial)
headers_participant, fields_participant = zip(*export_info_participant)
zipFile = ZipFile(in_memory, 'w')
rows = [headers_participant,headers]
result_row = []
result_row.append(rows)
for participant in queryset:
row1 = []
row2 = []
participants = Participant.objects.filter(id=participant.id)
trials = Trial.objects.filter(participant=participant.id)
for participant_value_list in participants.values_list(*fields_participant):
row1.append(unicode(v) for v in participant_value_list)
for trial_value_list in trials.values_list(*fields):
row2.append(unicode(v) for v in trial_value_list)
row = row1 + row2
result_row.append(row)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
writer = csv.writer(response)
for row in result_row:
writer.writerow(row)
通过 writerow ,您将在同一行CSV中的 result_row 中找到一个列表。