0

Pythonで2つのファイルを比較しようとしていますが、実際には古い警告ファイルと比較した後、新しい警告を見つけようとしています。

古いファイルの内容は次のようなものです。

warning1~file1
warning1~file1
warning2~file2
warning2~file2
warning2~file2

新しいファイルの内容は次のようなものです

warning1~file1
warning1~file1
warning1~file1
warning3~file3
warning2~file2
warning2~file2
warning2~file2

ご覧のとおり、新しいファイルには2つの新しい行のテキストwarning1〜file1 warning3〜file3があります。インターネットで2つのファイルを比較するために検索しましたが、どこでもテキストのすべての行が異なると想定しています。

small_file = open('file1','r')
long_file = open('file2','r')
output_file = open('newfile','w')

try:
    small_lines = small_file.readlines()
    small_lines_cleaned = [line.rstrip().lower() for line in small_lines]
    long_lines = long_file.readlines()
    long_lines_cleaned = [line.rstrip().lower() for line in long_lines]

    #for line in long_lines_cleaned:
    for line in long_lines_cleaned:
        if line not in small_lines_cleaned:
            output_file.writelines(line)

ここで見つけたこのコードを試してみましたが、実行した後、file1 の行が file2 で使用可能かどうかもチェックするだけであることに気付きました。そうでない場合は、新しいファイルに書き込みます。このメソッドは、新しい warning1 ではなく、warning3 のみをフェッチします。

すべての行が一度だけ比較されるものが必要です...そして残った行は新しいファイルに書き込まれます。

問題を適切に説明できたことを願っています。

4

1 に答える 1

2

a を使用しCounterて、出現回数の違いを見つけます。たとえば、次のようになります。

from collections import Counter

with open('file1', 'r') as f1, open('file2', 'r') as f2, open('newfile', 'w') as output:
    f1_lines = [line.rstrip().lower() for line in f1.readlines()]
    f2_lines = [line.rstrip().lower() for line in f2.readlines()]
    diff = Counter(f2_lines) - Counter(f1_lines)
    for msg, n in diff.iteritems():
        output.writelines((msg + '\n') * n)
于 2013-06-20T09:45:49.260 に答える