2015-05-18 50 views
0

我有一个CSV文件,我正在该文件中将某些字段(列)读入字典(以便一列作为键和其他作为值)。更确切地说,我有数字格式的键和字符串格式的值。但我在这里有一个问题。在CSV文件中,我有相同数字与多个字符串关联的情况。所以当我试图将我的字典打印到output.csv文件时,它确实按照我所希望的(key:value)格式打印它,但是它忽略了密钥具有多个与其关联的值的情况。从我观察到的情况来看,只有与该关键字相关的最新值才被保留,旧值被覆盖。当某些键具有多个值时,将字典打印到CSV文件

例如: 999测试1 999测试1 999的Test2 999 Test3的

在这种情况下,只有999:Test3的被打印在output.csv文件。我需要的是如果出现这种情况,它应该在output.csv文件上打印一条消息,如下所示。

999:有一个以上的测试

我怎样才能实现呢?这是我迄今为止编写的代码,用于输出字典以输出文件。但我需要一些帮助来结合上面的预期结果。

import csv 

infile = open('input.csv',"rb") 
reader = csv.reader(infile) 

outfile = open('output.csv',"wb") 
writer = csv.writer(outfile) 

mydict = dict((rows[18],rows[19]) for rows in reader) 
for key,value in mydict.items(): 
    writer.writerow([key,value]) 

infile.close() 
outfile.close() 

任何帮助表示赞赏。

谢谢!

+0

你是说在输入文件,因为你读的列18和19,也可以是具有行第18列中的值与前一行相同? – mauve

+0

python中的字典有唯一的键,所以你不能将Test分配给一个键。但是,您可以将一个列表分配给一个键。所以你可以做999 [Test1,Test1,Test2,Test3]。 – aph107

+0

@mauve:是的,你说得对。我想识别这些行并相应地打印错误消息。 –

回答

0

只是保持对已经找到密钥的标签,并测试他们:

import csv 

infile = open('input.csv', "rb") 
reader = csv.reader(infile) 

outfile = open('output.csv', "wb") 
writer = csv.writer(outfile) 

found_keys = {} 
for rows in reader: 
    k, v = rows[18], rows[19] 
    if k in found_keys and found_keys[k] != v: 
     print("found duplicate key {} with different values {} , {}".format(k, v, found_keys[k])) 
    else: 
     found_keys[k] = v 
     writer.writerow([k, v]) 

infile.close() 
outfile.close() 
+0

如果我有这样的键和值,该怎么办? 999 Test1 999 Test1 999 Test1在这种情况下,我不想打印错误消息。只有当一个密钥有多个“唯一”值时,我才需要错误消息。 –

+0

@python_newbie:更新的答案 – RickyA

+0

谢谢@RickyA。我想我现在正处于正确的轨道上。我会从那里拿走它。 –