foo.log
ツールによって生成された2つのログファイル(namedと)を比較するPythonスクリプトを作成したかっbar.log
たのです。ログファイルには、無視できる行と無視できない行があります(比較のため)。
無視できる行を識別する正規表現を作成しました。コードを実装した方法は次のとおりです。
import re
p_1 = re.compile(...) # Pattern 1 to be ignored
p_2 = re.compile(...) # Pattern 2 to be ignored
p_3 = re.compile(...) # Pattern 3 to be ignored
...
p_n = re.compile(...) # Pattern n to be ignored
with open("foo.log", mode = 'r') as foo:
with open("foo_temp.log", mode = 'w') as foo_temp:
for foo_lines in foo:
if p_1.match(foo_lines):
continue
elif p_2.match(foo_lines):
continue
elif p_3.match(foo_lines):
continue
...
...
...
elif p_n.match(foo_lines):
continue
else:
foo_temp.write(foo_lines)
with open("bar.log", mode = 'r') as bar:
with open("bar_temp.log", mode = 'w') as bar_temp:
for bar_lines in bar:
if p_1.match(bar_lines):
continue
elif p_2.match(bar_lines):
continue
elif p_3.match(bar_lines):
continue
...
...
...
elif p_n.match(bar_lines):
continue
else:
bar_temp.write(bar_lines)
スクリプトを実行すると、2つのファイルが取得され、foo_temp.log
後でbar_temp.log
WinMergeを使用して手動で比較します。以下は私の質問です:
1)正規表現の使い方を最適化できる方法はありますか(実際、正規表現は初めてで、その点で最適化できるものがたくさんあると感じています)
2)後で無視する新しいパターンを追加する必要がある場合、ユーザーの観点から新しいパターンを簡単に追加できるようにすることはできますか。(現在、新しいパターンを追加する必要があります。その後、2つの場所でチェックを行います。1つは用foo.log
、もう1つは用ですbar.log
)
3)巨大なファイルを扱うときにジェネレーターが使われていると聞いたことがあります。私が比較するログは比較的小さいですが(最大50MB)、ジェネレーターがどのように使用されているかを調べて、スクリプトに組み込む必要がありますか?
4)WinMergeを使用して手動チェックを作成foo_temp.log
しbar_temp.log
て実行するのではなく、Python自体で(縮小されたファイルの)比較を実行できる方法はありますか?filecmp
おそらくモジュールから何か?
注:無視できる行の中には、両方のログで(順序が狂って)ごちゃ混ぜになっているものがあります。たとえば、foo.log
次のようなパターンが考えられます。
Line 1: <<Pattern_1: Ignore>>
Line 2: <<Pattern_2: Do not Ignore>>
Line 3: <<Pattern_3: Do not Ignore>>
Line 4: <<Pattern_4: Do not Ignore>>
Line 5: <<Pattern_5: Ignore>>
一方bar.log
、次のパターンがあります。
Line 1: <<Pattern_1: Ignore>>
Line 2: <<Pattern_5: Ignore>>
Line 3: <<Pattern_2: Do not Ignore>>
Line 4: <<Pattern_3: Do not Ignore>>
Line 5: <<Pattern_4: Do not Ignore>>
無視できる行を削除すると、両方のファイルのパターンが同じになることに注意してください。そのため、一度に無視できる行をすべて削除してから、縮小したファイルを比較することにしました。