1

filetwos の内容を検索して、指定された検索用語 (fileone の行) の重複が含まれているかどうかを確認しようとしています。重複が含まれている場合は何もしませんが、重複が含まれていない場合は行を追加します。

fileone.txt (2 行)

[('123', 'aaa')]

[('900', 'abc')]

filetwo.txt

[('123', 'aaa')]

[('999', 'zzz')]

以下の私のコードは、行が重複していても filetwo に追加します。私はこれを理解することはできません!

with open('fileone.txt', 'r') as f:
seen = open('filetwo.txt', 'a+')
for line in f:
    if line in seen:
        print(line + 'is a duplicate')
    else:
        seen.write(line)

f.close()
seen.close()
4

1 に答える 1

2

指定された行をファイルif line in seen:全体で検索することはできません。seenできたとしても、ファイルの残りの部分しか検索されず、ファイルの最後にいるため、何も検索していないことになります。そして、その問題を解決したとしても、ファイル全体を各行ごとに線形検索する必要があり、非常に遅くなります。

最も簡単な方法は、表示されたすべての行を追跡することです。たとえば、次のようにしますset

with open('filetwo.txt') as f:
    seen = set(f)

with open('fileone.txt') as fin, open('filetwo.txt', 'a+') as fout:
    for line in fin:
        if line in seen:
            print(line + 'is a duplicate')
        else:
            fout.write(line)
            seen.add(line)

seen開始する前にすべての行を事前に入力してfiletwo.txtから、新しい行を 1 つずつ追加していることに注意してくださいseen。これにより、何度も読み直す必要がなくなりfiletwo.txtます。何を書いているかはわかっているので、覚えておいてください。

于 2013-08-29T22:07:28.960 に答える