如何根据两个文件中的公共信息通过Python合并两个CSV文件?

时间:2015-10-14 12:34:27

标签: python csv merge

埃文斯 十分感谢。这几乎是预期的结果。请亲自动手修改如下。 我们需要一点改变。请看一下图片。 在当前结果中,fileOne中的每个记录在fileTwo中搜索类似的adv_id和user_id,并在找到记录时将其取走并停止。但可能的是fileTwo中可能有几个类似的记录。所以,我们需要来自fileTwo的所有类似记录。并且fileOne的所有记录必须至少在fileTwo中可用一次或多次。因此,我们应该包括fileOne的所有记录以及来自fileTwo的所有类似记录。我认为逐行搜索可能会有所帮助。这是从fileOne的第一个的adv_id和user_id获取并搜索fileTwo中的所有记录以找到类似的记录。接下来使用fileOne的第二条记录并搜索fileTwo中的所有记录。等等。

Revised Image For Expected Result

1 个答案:

答案 0 :(得分:0)

以下脚本将根据您的原始样本数据创建result.csv(请参阅过去的编辑内容):

import csv
from collections import defaultdict

d_entries = defaultdict(list)

with open('fileTwo.csv', 'r') as f_fileTwo:
    csv_fileTwo = csv.reader(f_fileTwo)
    header_fileTwo = next(csv_fileTwo)
    for cols in csv_fileTwo:
        d_entries[(cols[0], cols[1])].append([cols[0], ''] + cols[1:])

with open('fileOne.csv', 'r') as f_fileOne, open('result.csv', 'w', newline='') as f_result:
    csv_fileOne = csv.reader(f_fileOne)
    csv_result = csv.writer(f_result)
    header_fileOne = next(csv_fileOne)
    csv_result.writerow(header_fileOne)

    for cols in csv_fileOne:
        if (cols[0], cols[2]) in d_entries:
            csv_result.writerow(cols)
            csv_result.writerows(d_entries.pop((cols[0], cols[2])))
在Excel中打开时,

result.csv将包含以下数据:

enter image description here

在Python 3.4.3中测试

仅匹配adv_id列并拥有所有条目:

import csv
from collections import defaultdict

d_entries = defaultdict(list)

with open('fileTwo.csv', 'r') as f_fileTwo:
    csv_fileTwo = csv.reader(f_fileTwo)
    header_fileTwo = next(csv_fileTwo)
    for cols in csv_fileTwo:
        d_entries[cols[0]].append([cols[0], ''] + cols[1:])

with open('fileOne.csv', 'r') as f_fileOne, open('result.csv', 'w', newline='') as f_result:
    csv_fileOne = csv.reader(f_fileOne)
    csv_result = csv.writer(f_result)
    header_fileOne = next(csv_fileOne)
    csv_result.writerow(header_fileOne)

    for cols in csv_fileOne:
        if cols[0] in d_entries:
            csv_result.writerows(d_entries.pop(cols[0]))
        csv_result.writerow(cols)