比较两个csv文件并将共享项写入新的csv文件

时间:2013-04-05 19:27:16

标签: python csv

我有两个以相同方式格式化的csv文件(两列数据):

    Name        Link
    Name        Link
    Name        Link
    Name        Link

它们之间的唯一区别是这两列中的数据(不同的名称和不同的链接)。我想找到两个csv文件中出现的名称和链接,并将它们写入新的csv文件。到目前为止,我已经尝试过:

    import csv

    f1 = file('/path/to/f1.csv', 'r')
    f2 = file('/path/to/f2.csv', 'r')
    f3 = file('/path/to/f3.csv', 'w')

    c1 = csv.reader(f1)
    c2 = csv.reader(f2)
    c3 = csv.writer(f3)

    masterlist = [row for row in c2]

    for hosts_row in c1:
        row = 1
        found = False
        for master_row in masterlist:
            results_row = hosts_row
            if hosts_row[3] == master_row[1]:
                results_row.append('FOUND in master list (row ' + str(row) + ')')
                found = True
                break
            row = row + 1
        if not found:
            results_row.append('NOT FOUND in master list')
        c3.writerow(results_row)

    f1.close()
    f2.close()
    f3.close()

这是基于对a similar question的回答,但是我意识到在这种情况下csv文件的格式是不同的。所以我得到了这个错误:

         masterlist = [row for row in c2]
    _csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

如何调整上述代码以适合我的csv文件的格式。或者有更好的方法吗?任何帮助都会非常受欢迎,因为我刚开始使用python而且我认为我还没有完全掌握在两个文件中比较数据的概念。

3 个答案:

答案 0 :(得分:1)

l1 = set(open('f1.csv'))
l2 = set(open('f2.csv'))
open('f3.csv', 'wb').writelines(l1 & l2)

l1l2分别是f1.csv和f2.csv中的行集。 l1 & l2计算set intersection两个文件中找到的行,并将它们输出到f3.csv。

答案 1 :(得分:0)

你的文件有多大?你可以在内存中加载它们吗?上面的代码加载其中一个。而且因为你对整行感兴趣(我猜),你不必在行内comapre内容。

你也不需要csv阅读器。

所以,试试

f1 = open('/path/to/f1.csv', 'r').readlines()
f2 = open('/path/to/f2.csv', 'r').readlines()
f3 = open('/path/to/f3', 'a')




for lines in f1:
    if lines in f2:
          f3.write(lines)


f1.close()
f2.close()
f3.close()

答案 2 :(得分:0)

根据文件的大小,使用字典来查明master_row中是否已找到host_rows [3]是有意义的。您的算法复杂度将从N1xN2下降到N1,因为字典访问是O(1)

这将是这样的:

master_dct = {}
for master_row in master_list :
    master_dct[master_row[3]] = None
results_row = []
for hosts_row in c1 :
    if hosts_row[1] in master_dct :
        results_row.append(hosts_row)