Python:双向去重复

时间:2016-04-01 09:14:32

标签: python for-loop duplicates

我在尝试重复删除两个文本文件时遇到问题。 这应该是一项相当容易的任务,但情况如下:

我有两个用相同的python脚本创建的文本文件。 每个文件包含X行具有相同格式的行,类似于:

Keys added,HKLM\SOFTWARE\Wow6432Node\Microsoft\Tracing\notepad++_RASAPI32 Keys added,HKLM\SOFTWARE\Wow6432Node\Microsoft\Tracing\notepad++_RASMANCS Keys added,HKLM\SYSTEM\ControlSet001\Control\Class\{3A1380F4-708F-49DE-B2EF-04D25EB009D5} Keys added,HKLM\SYSTEM\ControlSet001\Enum\Root\LEGACY_PROCMON23 Keys added,HKLM\SYSTEM\ControlSet001\Enum\Root\LEGACY_PROCMON23\0000 Keys added,HKLM\SYSTEM\ControlSet001\Enum\Root\LEGACY_PROCMON23\0000\Control Keys added,HKLM\SYSTEM\ControlSet001\services\PROCMON23

我知道文本文件A与文件B具有一些完全相同的行,但它也有唯一的行。文件B也有唯一的行(显然文件A中有一些完全相同的行)。

我希望我的脚本输出3个文本文件,一个用于文件A中的唯一行,一个用于文件B中的唯一行,另一个用于包含重复行。

我的脚本因此似乎做了我想要它的一半,它拾取了两个文件中存在的一些行并将它们放在一个文本文件中,但它不适用于其他一些,我觉得很奇怪正在处理的文件的格式完全相同(因为我使用另一个Python脚本来创建它们)

例如,行Keys added,HKLM\SYSTEM\ControlSet001\Enum\Root\LEGACY_PROCMON23存在于两个文件中,但未被识别。

然而,行Keys added,HKLM\SOFTWARE\Wow6432Node\Microsoft\Tracing\notepad++_RASAPI32也存在于两个文件中,但它已被识别。

我的脚本现在看起来像这样:

import sys

input_1 = open(sys.argv[1]).read().splitlines()
input_2 = open(sys.argv[2]).read().splitlines()
print 'First argument is biggest log'

dupes = open('overeenkomsten.txt', 'a')
onlyTen = open('onlyTen.txt', 'a')
onlySeven = open('onlySeven.txt', 'a')

for line in input_1:
    #print line
    if line in input_2:
        #print 'check'
        dupes.write(line+'\n')
    else:
        #print 'check 2'
        onlyTen.write(line+'\n')

for line in input_2:
    if line not in input_1:
        #print 'check 3'
        onlySeven.write(line+'\n')
    else:
        continue

dupes.close()
onlyTen.close()
onlySeven.close()

回答时请记住,我想遍历两个文件中的所有行。因此,如果我将其中一个文件作为input_1,我仍然需要通过input_2运行for循环,因为我想知道input_2中哪些行不在input_1中。

提前致谢

1 个答案:

答案 0 :(得分:1)

这看起来非常像设置逻辑。 如果订单不重要,那么这是一种方法:

s1 = set( input_1 )
s2 = set( input_2 )

lines_in_both_files = s1.intersection(s2)
lines_in_either = s1.union(s2)

# lines in input_1 not in input_2
l1_n2 = s1 - s2
# lines in input_2 not in input_1
l2_n1 = s2 - s1

如果订单很重要,请执行以上操作,然后在写入之前使用“myset中的line”进行检查。