Python合并具有匹配索引的csv文件

时间:2015-04-21 18:43:00

标签: python csv

我想根据字段合并两个CSV文件 第一个看起来像这样:

ID, field1, field2
1,a,green
2,b,white
2,b,red
2,b,blue
3,c,black

第二个看起来像:

ID, field3
1,value1
2,value2

我想要的是:

ID, field1, field2,field3
1,a,green,value1
2,b,white,value2
2,b,red,value2
2,b,blue,value2
3,c,black,''

我在eclipse上使用pydev

import csv

endings0=[]
endings1=[]
with open("salaries.csv") as book0:
    for line in book0:
        endings0.append(line.split(',')[-1])
        endings1.append(line.split(',')[0])

linecounter=0


res = open("result.csv","w")

with open('total.csv') as book2:
    for line in book2:
        # if not header line:

        l=line.split(',')[0]
        for linecounter in range(0,endings1.__len__()):            
            if( l == endings1[linecounter]):
                res.writelines(line.replace("\n","") +','+str(endings0[linecounter]))


print("done") 

2 个答案:

答案 0 :(得分:3)

你正在做的事情有很多问题

  1. 你应该真的 真的使用csv模块中的类来读写csv文件。导入模块是不够的。你实际上需要调用它的函数

  2. 您永远不应该找到自己输入endings1.__len__()。请改用len(endings1)

  3. 您永远不会发现自己键入for linecounter in range(0,len(endings1)) 使用for linecounter, _ in enumerate(endings1)
    或者更好for end1, end2 in zip(endings1, endings2)

  4. 字典是一种比一对并行列表更好的查找数据结构。引用pike

      

    如果您选择了正确的数据结构并组织好的事情,算法几乎总是不言而喻。

  5. 我是这样做的:

    import csv
    
    with open('second.csv') as f:
        # look, a builtin to read csv file lines as dictionaries!
        reader = csv.DictReader(f)
    
        # build a mapping of id to field3
        id_to_field3 = {row['ID']: row['field3'] for row in reader}
    
    # you can put more than one open inside a with statement
    with open('first.csv') as f, open('result.csv', 'o') as fo:
        # csv even has a class to write files!
        reader = csv.DictReader(f)
        res = csv.DictWriter(fo, fieldnames=reader.fieldnames + ['field3'])
    
        res.writeheader()
        for row in reader:
            # .get returns its second argument if there was no match
            row['field3'] = id_to_field3.get(row['ID'], '')
            res.writerow(row)
    

答案 1 :(得分:0)

我有一个高级解决方案。 将您的第一个CSV反序列化为dict1映射ID到包含包含field1和field2的列表的列表。 将第二个CSV反序列化为dict2映射ID到field3。

对于dict1中的每个(ID,列表),执行list.append(dict2.setdefault(id, ''))。现在使用您之前使用的任何序列化程序将其序列化为CSV。

我使用了字典setdefault,因为我注意到ID 3位于第一个CSV文件中,但不是第二个。