Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个csv文件并将共享项写入新的csv文件_Python_Csv - Fatal编程技术网

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

Python 比较两个csv文件并将共享项写入新的csv文件,python,csv,Python,Csv,我有两个格式相同的csv文件(两列数据): 它们之间的唯一区别是这两列中的数据(不同的名称和不同的链接)。我想找到出现在两个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.re

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

它们之间的唯一区别是这两列中的数据(不同的名称和不同的链接)。我想找到出现在两个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,我认为我还没有完全掌握比较两个文件中数据的概念

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

你也不需要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()

根据文件的大小,可以使用字典来确定是否已在master_行中找到host_行[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)

l1
l2
分别是f1.csv和f2.csv中的行集<代码>l1和l2计算出两个文件中的行,并将它们输出到f3.csv。

您只能将f2作为一个整体读取,并在f1中的行上迭代。这会节省一些内存。你确定你的代码吗?您有三次未定义f1=和fs_签入*。@Dave先生,哎呀,在将我的原始代码转移到本文中时忘了做这些更改。根据@Björn Lindqvist的建议,找到了使用集合和
&
查找交点的简单解决方案。我的代码中唯一的区别是我在文件开启器上调用了
.readlines()
方法,并为每个项目加入了
/n
,这样数据就不会全部输入csv中的一列:
f3=file('/path/to/f3.csv',w')f1=set(open('/path/to/f1.csv').readlines())f2=set(open('/path/to/f2.csv').readlines())相似性=f1和f2 f3.write('\n'.join(相似性))f3.close()
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)
l1 = set(open('f1.csv'))
l2 = set(open('f2.csv'))
open('f3.csv', 'wb').writelines(l1 & l2)