0

我有两个格式相同的 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()

这是基于对类似问题的回答,但是我意识到在这种情况下 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,而且我认为我还没有完全掌握比较两个文件中的数据的概念。

4

3 回答 3

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

l1并且l2分别是 f1.csv 和 f2.csv 中的行集。l1 & l2评估为在两个文件中找到的行的集合交集,并将它们输出到 f3.csv。

于 2013-04-05T20:41:16.833 回答
0

你的文件有多大?你能把它们都加载到内存中吗?上面的代码加载其中之一。而且因为您对整行感兴趣(我猜),所以您不必在行内比较内容。

您也不需要 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()
于 2013-04-05T19:41:27.427 回答
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)
于 2013-04-05T20:06:21.883 回答