2016-11-02 60 views
0

我有一个csv文件,有几百行。Python3打开CSV做逻辑写新csv

为了简单起见,让我们去这三个标题:

Asignee, ClientName, Lead 

Carl Jr, TestCompany, NO 
James, TestCompany, NO 
Sarah H, TestCompany, NO 
Osvaldo W, OtherCorp, Osvaldo W 
Walter Green, OtherCorp, No 
Ace Ven, PetDick, No 
Dan Marino, PetDick, No 

因此,在这种情况下,在新的文件我想这是写

PetDick, No 
TestCompany, No 

而且,由于该有的都有一个领导我不关心这份报告的内容。

文件中的行数可能与受管理者PER ClientName的数量相同。 我需要做的是找出哪个ClientNames没有铅。

这是我到目前为止有:

import csv 

def createReport(): 
    with open('/home/origReport.csv', 'rt') as origfile, open('/home/newReport.csv', 'wt') as out: 
    reader = csv.DictReader(origfile) 
    writer = csv.writer(out, lineterminator='\n') 
    for row in reader: 
     if row['Lead'] == 'NO': 
     writer.writerow(row["Lead"]) 

createReport() 

这给了我不是我想要在输出方面。

N,O 
N,O 
N,O 

如果我尝试把它放在脚本中。

writer.writerow(row["ClientName","Lead"]) 

我得到

Traceback (most recent call last): 
File "test2.py", line 15, in <module> 
createReport() 
    File "test2.py", line 12, in createReport 
writer.writerow(row["ClientName","Lead"]) 
KeyError: ('ClientName', 'Lead') 

而且我不知道是什么,并增加if语句。

本质上我想找到Lead是否为NO的每一行,而且还有其他行中LeadName是不存在的客户端名称(或基本上任何事物,但不是)。如果Lead对于不同行上的相同ClientName不是NO,那么它应该被排除在本报告中。

在此先感谢您的帮助。

回答

1

尝试

writer.writerow([row["Lead"], row["ClientName"]]) 

writerow接受一个数组。您获得第一个输出,因为您的输入row["Lead"]已隐式转换为["N", "O"];

+0

谢谢,这工作得到正确的输出。对逻辑的任何想法....试图找到最简单的方法来做到这一点。但它没有到我这里来。 –

+0

一个简单的方法是迭代文件两次或将文件读入对象,然后迭代两次。在第一次迭代中,构造一个映射来记录是否出现了具有非NO Lead的某个clientName,并在第二次迭代中利用该映射完成您的逻辑。 – yehe

+0

听起来像是一个很好的解决方案...不知道如何制作地图。现在我在用谷歌搜索 –