2016-04-01 9 views
1

2つのテキストファイルを重複排除しようとすると問題が発生します。 これはかなり簡単な作業ですが、状況は次のとおりです。Python:双方向重複除外

同じPythonスクリプトで作成された2つのテキストファイルがあります。 各ファイルは次のようにされて、同じ形式のラインの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つのテキストファイルを出力したいと思います.1つはファイルAの一意の行、もう1つはファイル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としてファイルの1つを取る場合、input_2にinput_2にどの行があるか知りたいので、input_2を通してforループを実行する必要があります。これはとてもたくさん見え事前

+1

ファイルのサイズはどれくらいですか?あなたはset操作を使用できませんか? – Schore

+0

数千から500.000 +までのラインがありますが、パフォーマンスを念頭に置いていないと、スクリプトを10分以上実行することができます(試しました)。あなたは、Oveが答えた答えを意味しますか? – Nick

答えて

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 

、その後、書き込む前に「マイセット内の行」を使用して確認してください。

+0

シンプルで有望です。順序は大したことではない、私はいつでも後で並べ替えることができます。重要なのは、ファイルBに固有のファイルAに固有の行と、その両方に存在する行が分かっていることです。 – Nick

+1

魅力的な作品です! – Nick