2015-09-06 95 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,欢呼声。 –