2015-09-06 96 views
1

我有一大堆的名單,我已經拉上:添加頁眉到CSV文件

zipped = zip(list1, list2, list3) 

我有一個csv文件(已經有頭部)看起來是這樣的:

Col_1 Col_2 Col_3 
data  data  data 

現在我想加我壓縮列爲列已存在的文件,以便它看起來像這樣(用列表的名稱作爲標題):

Col_1 Col_2 Col_3 list1 list2 list3 
data  data  data  data  data  data 

我現在有這樣的代碼:

with open('existing.csv', 'rb') as infile, open('out_file.csv', 'wb') as outfile: 
    reader = csv.reader(infile) 
    writer = csv.writer(outfile) 
    writer.writerow(["list1", "list2", "list3"]) 
    for i, row in enumerate(reader): 
     row.extend(zipped[i]) 
     writer.writerow(row) 

但不幸的是,這會覆蓋現有的列名。

+1

請編輯你的問題,併發布你得到的確切輸出。 – MattDMo

+0

您可以將DictWriter與['writeheader()'](https://docs.python.org/2/library/csv.html#csv.DictWriter.writeheader)方法一起使用。 –

回答

2

你需要保持現有的頭是從你的讀者對象的第一行:

with open('existing.csv', 'rb') as infile, open('out_file.csv', 'wb') as outfile: 
    reader = csv.reader(infile) 
    header = next(reader) # get header 
    writer = csv.writer(outfile) 
    # create list with old header and new 
    writer.writerow(header+["list1", "list2", "list3"]) 

您還可以使用itertools.izip來壓縮列表中的for循環調用next得到各個子元件:

from itertools import izip 
zipped = izip(list1, list2, list3) 
with open('existing.csv', 'rb') as infile, open('out_file.csv', 'wb') as outfile: 
    reader = csv.reader(infile) 
    headers = next(reader) 
    writer = csv.writer(outfile) 
    writer.writerow(headers+["list1", "list2", "list3"]) 
    for row in reader: 
     row.extend(next(zipped)) 
     writer.writerow(row) 

您自己的代碼實際上不會覆蓋標題,它會添加您的新標題,然後直接在您的壓縮列表中將第一個子元素與壓縮列表中的第一個子元素進行壓縮。

+1

@ user3100115,歡呼聲。 –