Python 如何比较两个文件以仅获取不在第二个文件中的行?

Python 如何比较两个文件以仅获取不在第二个文件中的行?,python,Python,我有两个这样的文件: file 1 : file 2 : col1 col2 col1 col2 john kerry john kerry adam lord bob abram joe hitch 我想根据lastnames和firstnames比较这两个文件,只得到一个不

我有两个这样的文件:

file 1 :                     file 2 :
col1    col2                 col1     col2
john    kerry                john     kerry
adam    lord                 bob      abram  
joe     hitch               
我想根据lastnames和firstnames比较这两个文件,只得到一个不包含文件2中人员的文件,也就是说:

desired output file :

col1     col2
adam     lord
joe      hitch
我试过了,但是没有得到正确的输出

import csv

reader1=csv.reader(open('file1.csv', 'r'), delimiter='\t')
reader2=csv.reader(open('file2.csv', 'r'), delimiter='\t')
writer=csv.writer(open('desired_file.csv', 'w'), delimiter=',')

row1 = reader1.next()
row2 = reader2.next()

if (row1[0] == row2[0]) and (row1[1] == row2[1]):
    print 'equal'
else:
    writer.writerow(row1)
    writer.writerow(row2)

如果文件格式相同,我认为您不需要
csv
模块。 这个解决方案怎么样:

exclude_names = frozenset(open('file2')) # make set for performance
with open('output', 'w') as f:
    for name in open('file1'):
        if name not in exclude_names:
             f.write(name)
带有
csv
读写器的解决方案:

import csv

exclude_names = frozenset(csv.reader(open('file2.csv', 'r'), delimiter='\t'))    
with open('desired_file.csv', 'w') as f:
    writer = csv.writer(f, delimiter=',')
    for row in csv.reader(open('file1', 'r'), delimiter='\t'):
         if row not in exclude_names:
              writer.writerow(row)

我会使用一组差异:

with open('file1') as f1, open('file2') as f2:
    data1 = set(f1)
    lines_not_in_f2 = data1.difference(f2)
如果文件的格式可能略有不同,则可能需要将文件对象包装到生成元组的生成器中:

def people(my_file):
    for line in myfile:
        yield tuple(x.lower() for x in line.split())

with open('file1') as f1, open('file2') as f2:
    data1 = set(people(f1))
    people_not_in_f2 = data1.difference(people(f2))
这样做的优点是不需要将整个f2文件读入内存。它的缺点是输出名称无序(因为它们存储在一个集合中)

如果顺序不重要,则使用
set(reader1)-set(reader2)

myfile = open(..., 'wb')
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(results)

将文件1中的所有条目添加到某种数据结构中。从该数据结构中删除文件2中的每个条目(如果存在)。然后输出数据结构。我在第一列第一行得到:“john,kerry”only@defuz“我敢肯定它会的。为什么不呢?f1是一个迭代器,set非常乐意使用迭代器<代码>设置(iter(范围(10))@defuz——这可能是您最后一天使用
readlines()
-我想你需要
set(a)-set(b)
<代码>&将从这两个集合中提取元素。@magilson--当然你是对的,错读了这个问题,找到了这两个集合中的项目,还有i==j。修复了它。您的第一个示例还假设
a
b
中的行可能是相同的,如果
a
name\u list.txt
b
exclude\u list.txt
,这似乎是一个非常粗略的假设。最后,在第一个示例中不需要列表comp,因为
zip
对迭代器非常满意。
myfile = open(..., 'wb')
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(results)