6

ここで問題が見えず、気が狂ってしまいます。2 つのテキスト ファイルをループしています。各ファイルの一部の行は一致し、一部は一致しません。私がやっていることは、file1 をループすることです。そのファイルの各行について、file2 をループし、各要素を比較して、それらが同じかどうかを確認します。何が起こっているのかというと、file1 の最初のループの後にループが停止しています。これが私のコードです:

while f < 50:
    for line in file1:
        for name in file2:
            if name == line:
                print 'a match was found'
    f+=1

while ループは別の場所から来ていますが、正常に動作しています。文脈のためにそれを含めただけです。問題は、file1が最初の行だけを提供し、それをfile2のすべての「名前」と比較してから、file1の次の行のプロセスを繰り返す代わりに停止することです。明らかに明らかな何かが欠けていますか?

編集: 最初の for ループの後に print ステートメントを挿入し、他の for ループをコメント アウトすると、最初のファイル全体がループされます。

4

4 に答える 4

12

ファイルをループしてから、最初にシークせずに同じファイルを再度ループすることはできません。

file2 を再度開くか、file2 を呼び出す.seek(0)か、すべての行をリストにロードして、代わりにループします。

あなたの特定のケースでsetは、名前に a を使用すると、おそらく最速になります。

names = set(name.strip() for name in file2)
while f < 50:
    for line in file1:
        if line.strip() in names:
            f += 1

ファイル 1 とファイル 2 の両方で行が一意である場合、ファイル 1 の行で同じことを行い、集合交差を行うことができます。

于 2012-07-24T16:16:06.470 に答える
4

問題は、 を反復するfile2と、使い果たされてしまい、内側の for ループが実行されなくなってしまうことです (file2反復するものが何も残っていないため)。ループのたびに file2 を閉じる/再度開くか、そのループが実行される前に先頭に戻ることができます。

少し良い方法は、セットを使用することです (ファイルが大きすぎず、ファイルまたは順序内の重複を気にしない場合)。

matches = set(file1).intersection(file2)

これにより、file1 のみがメモリに読み込まれ、file2 に対して暗黙的にループが実行されます。

于 2012-07-24T16:16:16.753 に答える
3

内部ループが最初に終了した後、file2 の内部反復子が最後に到達したため、解決策は毎回 file2 の内部反復子をファイルの先頭に向けることです。次に例を示します。

while f < 50:
    for line in file1:
        file2.seek(0, 0)
        for name in file2:
            if name == line:
                print 'match!'
于 2012-07-24T16:21:03.287 に答える
0

ファイルのサイズに応じて、readlines()関数を使用して各ファイルの行をリストに読み込むことができます。

次に、これらのリストを繰り返し処理します。これにより、ファイル位置の現在の位置に問題がないことが保証されます。

于 2012-07-24T16:22:52.097 に答える