2017-02-10 34 views
0

我正在改進一些開放源代碼的心理測試。 對於數據輸出,我使用了python的CSV模塊,它本身工作正常。數據輸出取決於Django模型(試驗)和相應的數據庫條目,我想將其他模型(參與者)的數據添加到CSV中。到目前爲止,我只設法在新行中添加所需的條目,但這基本上使CSV不能用於統計程序中的進一步使用。 總之我得到什麼:用python編寫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

一個建議,看看DictWriter。當你想爲單行生成一條記錄並將其寫入csv文件時,它非常棒。 –

+0

我認爲你需要合併這些列表。將列表添加到結果列表中,然後迭代它。更新了我的答案。 –

回答

0

您可以使用writerow Python的CSV的csv.writer的,像這樣:

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列表。

+0

作家已經實現這樣的: 'F = StringIO的() 作家= UnicodeWriter(F)中的行 用於行: writer.writerow(行)' 其中UnicodeWriter基本上是一個簡單的作家修改。我也試過你的解決方案,但列表中的條目在我的情況下似乎不太有用。 無論如何謝謝你! – TimS

+0

@TimS多數民衆贊成在說什麼。你不需要用for循環迭代行。只需使用我更新的答案。 –

+0

我這樣做,因爲我有幾個條目需要打印到CSV中。基本上,在我的測試案例中,每個創建的CSV應該有十一行:一個用於標題,十個用於一個進行測試的測試結果。但是,如果我不迭代,一切都放在第一行。也許我對所需輸出的描述是不明確的。我想要一行標題,然後是幾行內容,而每行都從兩個不同的模型中獲取它的值。這是否更有意義? – TimS