使用python在csv中用一行写几个字段

时间:2017-02-10 10:16:36

标签: python django csv django-models

我正在努力改进一些心理测试的开源代码。 对于数据输出,我使用的是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)

我还添加了上面函数的前一部分。

我感谢大家的帮助!

1 个答案:

答案 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 中找到一个列表。