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)