2012-02-16 71 views
1

我正在瀏覽如何將我的數據導出到CSV文件的django文檔,以便它可以導入到Excel中。到目前爲止,我得到它的工作,但即時通訊有點麻煩搞清楚如何我可以在我的模型中導出ManyToMany字段。Django CSV導出..在列表中迭代

到目前爲止,我已經

writer = csv.writer(response) 
writer.writerow(['A','B', 'C', 'D']) 

    for x in case_log_list: 
     writer.writerow([x.A, 
       x.B, 
       for y in x.C.all: 
        y, 
       x.D) 

其中的[名單]內環是我試圖遍歷該字段中的多對多的對象。然而,我不斷收到一個語法錯誤,沒有任何意義..我是否正確地去解決這個問題?

+0

請指定您收到的語法錯誤。 (複製並粘貼Python會話中的整個錯誤。) – 2012-02-16 07:46:24

回答

2
  1. 您錯過了列表定義中的終止]
  2. 您不能在列表中放置for循環。

x.C是某種列表或序列嗎?您是否打算將每個x.C項目作爲CSV中的單獨字段編寫?

我相信你打算使用列表連接運算符+,它將兩個列表粘在一起並列成一個列表。使用它像這樣:

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> a + b 
[1, 2, 3, 4, 5, 6] 

你舉的例子就變成:

for x in case_log_list: 
    c_list = [item for item in x.C.all]   # turn x.C into a list 
    output_list = [x.A, x.B] + c_list + [x.D,] # assemble list 
    writer.writerow(output_list) 

或者,如果你想成爲簡短:

for x in case_log_list: 
    writer.writerow ([x.A, x.B] + [item for item in x.C.all] + [x.D,]) 

注:

  • 如果x.C.all是已經是一個列表 - 也就是說,如果type(x.C.all) is listTrue - 那麼[x.A, x.B] + x.C.all + [x.D,]就足夠了。

  • c_list = [item for item in x.C.all]列表理解,它可以讓你做的事情的清單,而無需編寫一個for循環。

    列表解析非常強大,非常優雅,您應該儘可能使用它們。無論何時您需要根據另一個列表製作列表,按照某個標準篩選列表中的項目,或者同時對這兩個列表進行篩選,列表理解可能是一個好方法。

  • 單字母變量名狀xABCD是真的很可怕,因爲他們沒有給出關於變量保存什麼數據,什麼樣的類型可以是信息,什麼樣的價值觀它可能包含,使用等如果可以的話,更多的描述性變量名稱。

1

您必須在將數據插入csv之前創建數據。

您可以在對其執行寫入操作之前獲取所有寫入數據。

mydata = [x.A,x.B] 

mydata += [y for y in x.C.all] 
mydata.append(x.D) 
# write mydata to the csv. 

這樣你就可以獲得數據並直接寫入到csv。