2013-04-25 280 views
0

我有一個python列表,我想將它導出到csv文件,但我不想將所有列表存儲在同一行中。我想在給定的位置切分列表並開始一個新行。事情是這樣的:如何將python列表導出到csv並添加換行符

list = [x1,x2,x3,x4,y1,y2,y3,y4] 

,我想它導出這種格式

x1 x2 x3 x4 
y1 y2 y3 y4 

到目前爲止,我有這樣的:

import csv 
A = ["1", "2", "3", "4", "5", "6", "7", "8"] 
result = open("newfile.csv",'wb') 
writer = csv.writer(result, dialect = 'excel') 
writer.writerow(A) 
result.close 

和輸出看起來是這樣的:

1 2 3 4 5 6 7 8 

我w應該喜歡的輸出爲

1 2 3 4 
5 6 7 8 

有什麼建議嗎?任何幫助表示讚賞。

回答

1

對於list(稱之爲seq)和目標行長度(稱之爲rowsize),你會做這樣的事情:

split_into_rows = [seq[i: i + rowsize] for i in range(0, len(seq), rowsize)] 

然後,您可以使用作家的writerows方法寫入元素的文件:

writer.writerows(split_into_rows) 

對於惰性計算,用生成器表達式來代替:

split_into_rows = (seq[i: i + rowsize] for i in range(0, len(seq), rowsize)) 
+1

或者查找中間列表,並將其作爲生成器表達式直接傳遞給'writerows'。 – 2013-04-25 04:18:57

+1

@StevenRumbalski:採取了點。我認爲,爲了說明的目的,更好地分開這些步驟。 – 2013-04-25 04:20:35

+0

糾錯:您不能使用'islice()',因爲'csv.writer.writerows()'只能處理序列中的行。 – 2013-04-25 04:36:44

0

我建議使用一個臨時陣列B.

  1. 獲取原始數組A
  2. 複印的長度第一則爲a.length/2到陣列乙
  3. 添加新行字符陣列B.
  4. 追加數組A的其餘部分B.
  5. 以這種方式列出打交道時
0

,最好使用numpy的模塊:

import numpy as np 
A = ["1", "2", "3", "4", "5", "6", "7", "8"] 
#now to convert your list into a 2-Dimensional numpy array 
A = np.array((A)).reshape((2,4)) 
result = open("newfile.csv",'wb') 
writer = csv.writer(result, dialect = 'excel') 
#you use writer.writerows() instead of .writerow because you have multiple rows rather than one 
writer.writerows(row) 
result.close 

numpy提供了許多操作列表的方法。看看一些文檔here

是的有很多方法可以做你想做的事情,但是你必須處理的不僅僅是簡單地等同於range(1,9)和numpy的列表,你不僅可以簡潔地做你想做的事情這樣做,你可以操縱你在很多很多不同的方式列表,一旦你將其轉換爲numpy的陣列

+0

你可以使用'writer.writerows()'來避免顯式的'for'循環。 – 2013-04-25 04:38:57

+0

謝謝,我忘了那個。 – 2013-04-25 04:54:44

-1

import itertools 
l = ['a1','a2','b1','b2'] 

def toCSV(fname,l): 
    with open(fname+'.csv','w') as f: 
     f.write('\n'.join([','.join(list(g)) for k,g in itertools.groupby(l,key=lambda k: k[0])])) 


toCSV('mycsv',l) 

會產生

a1,a2 
b1,b2 

它很大程度上依賴於itertool的groupby函數。 Python Doc。從本質上講,它將根據一個鍵對元素進行分組。可以使用lambda表達式來計算密鑰,在這種情況下,該表達式將是數字之前的代數字母。

+1

我不認爲在處理CSV數據時,不應該使用'csv'模塊。 – 2013-04-25 04:37:51

+0

在這種情況下,也不是一個特別好的理由* *使用csv模塊 – HennyH 2013-04-25 06:08:07

+0

使用csv文件的'csv'模塊有效地傳達了程序員的意圖,並標準化了csv格式。請注意,OP選擇了'dialect =「excel」',而不用擔心是使用'\ r \ n'還是'\ n'作爲行結束符,使用'quotechar'等等...... – 2013-04-25 11:31:19

0
>>> import csv 
>>> A = ["1", "2", "3", "4", "5", "6", "7", "8"] 
>>> with open("newfile.csv",'wb') as f: 
     w = csv.writer(f) 
     w.writerows(zip(*[iter(A)]*4)) 
+0

當我運行這個,我得到以下錯誤: * TypeError:'str'不支持緩衝區接口* – HennyH 2013-04-25 06:40:40