Python 比较两个文件并删除公用行

Python 比较两个文件并删除公用行,python,Python,我有两个文件。带有数据的文件1 DF2SVT-(.CD(),.CP(clk),.D(),.SDN(),.Q(na)); OAI3DSVT-(.A1(na),.A2(),.A3(),.B(),.ZN(y)); GLHSVT-(.D(v),.E(),.Q(y)); DCCDSVT-(.I(w),.ZN(y)); GLHSVT-(.D(v),.E(),.Q(y)); 和带有数据的文件2 DF2SVT-(.CD(),.CP(clk),.D(),.SDN(),.Q(na)); OAI3DSV

我有两个文件。带有数据的文件1

DF2SVT-(.CD(),.CP(clk),.D(),.SDN(),.Q(na));

OAI3DSVT-(.A1(na),.A2(),.A3(),.B(),.ZN(y));

GLHSVT-(.D(v),.E(),.Q(y));

DCCDSVT-(.I(w),.ZN(y));

GLHSVT-(.D(v),.E(),.Q(y));
和带有数据的文件2

DF2SVT-(.CD(),.CP(clk),.D(),.SDN(),.Q(na));

OAI3DSVT-(.A1(na),.A2(),.A3(),.B(),.ZN(y));

GLHSVT-(.D(v),.E(),.Q(y));

DCCDSVT-(.I(w),.ZN(y));

GLHSVT-(.D(v),.E(),.Q(y));
如果文件2中的行出现在文件1中,则从文件1中删除该行并打印文件1的其余行。 所以我希望输出文件fout为

DF2SVT-(.CD(),.CP(clk),.D(),.SDN(),.Q(na));

OAI3DSVT-(.A1(na),.A2(),.A3(),.B(),.ZN(y));

DCCDSVT-(.I(w),.ZN(y));
我知道如何使用

for line in file1 & file2:
    if line:
       print line

但如果存在匹配项,我不知道如何从文件中删除该公共行。

将两个文件的行读入一个单独的变量中。对第一个文件的行进行迭代,并针对每一行检查它们是否存在于第二个文件中,如果不存在,则将它们保存到第一个文件中

with open(file1, "r") as file1:
     lines_file1 = file1.readlines()
with open(file, "r") as file2:
     lines_file2 = file2.readlines()
     with open(file1, "w") as f_w:
           for line in lines_file1:
               if line not in lines_file2
                  f_w.write(line)

这种方法的缺点是您正在将整个文件加载到内存中。

您可以使用设置操作来完成此操作,只需几行代码

读取两个文件,将行列表转换为集合并使用集合操作

line_file1 = set(line_file1)
line_file2 = set(line_file2)
result = line_file1 - line_file2
现在写入结果将每个元素(行)设置到文件中

注意:文件1中的重复数据也将被删除