1

私はPython初心者で、2つのファイルの行間の値を比較して、「行名」を出力しようとしています。行が2番目のファイルにある場合は1、行が2番目のファイルにない場合は0です。その行は 2 番目のファイルにあるため、最初の反復では 1 が返されますが、1,000 行を超える残りの行については、2 番目のリストにあるかどうかに関係なく、すべて 0 が返されます。2 番目の「for ループ」は最初の繰り返しでのみ実行されるようです。理由についてのアイデアはありますか?これが私のコードです:

    import sys  

    file1 = sys.argv[1] 

    file2 = sys.argv[2]

    name = str(file2)

    f1 = open(file1, 'r') 
    f2 = open(file1, 'r')
    o1 = open((name + '1.txt'), 'w')

    for line in f1:
        name = line.strip('\r\n')
        count = 0
        for line1 in f2:
            if name == line1.strip('\r\n'):
                count += 1
                print (str(name) + '\t' + str(1))
                o1.write(str(name) + '\t' + str(1) + '\r\n')
        if count == 0:
            print (str(name) + '\t' + str(0))
            o1.write(str(name) + '\t' + str(0) + '\r\n')

    f1.close()
    f2.close()
    o1.close()
Any help is very much appreciated!

いくつかの変更の後、これは私が持っているものであり、「1」のみを返します

f1 = open(file1, 'r') #opens files for reading
f2 = open(file2, 'r')
o1 = open((name + '1.txt'), 'w')

f2s = {line.strip('\n') for line in f2}

for line in f1:
    line = line.strip('\n')
    count = 0
    if line in f2s:
        count += 1
        print (str(line) + '\t' + str(1))
        o1.write(str(line) + '\t' + str(1) + '\n')
    if count == 0:
        print (str(line) + '\t' + str(0))
        o1.write(str(line) + '\t' + str(0) + '\n')

恥ずかしいことに、同じファイルを 2 回開いていました。ルーキー。

4

3 に答える 3

3

f2は 2 番目のファイルに対するイテレータであり、それが読み取られると使い果たされます。

iterator をリセットできますf2.seek(0, 0)が、それは最善の方法ではありません。

からのすべての値f2を a に入れてから、 1 回だけset反復することをお勧めします。f1

f2s = {line.strip('\n') for line in f2}

for line in f1:
    name = line.strip('\n') # No need for \r\n
    if name in f2s:
        # etc.

の各行の出現回数をカウントする必要がある場合はf1f2次を使用できますCounter

from collections import Counter
f2c = Counter(line.strip('\n') for line in f2)

for line in f1:
    name = line.strip('\n')
    if name in f2c:
        count = f2c[name]
于 2013-02-06T20:22:53.457 に答える
1

を初めて実行すると、現在のファイル ポインタがファイルの末尾に残さfor line in f2:れ、 のすべての行が処理されます。f2そのため、2 回目はファイルの末尾から開始し、残りの 0 行すべてを通過します…</p>

それを繰り返したい場合は、いくつかの方法があります。f2 = open(file1, 'r')を外側のループに移動できます。または、でファイルをリセットすることもできますf2.seek(0, 0)。または、 を使用できますitertools.tee

しかし、ファイル全体を一度に保持するためのメモリが実際にない場合を除きlist、最初に行を読み込んで、それを繰り返すことをお勧めしますlist:

l2 = list(f2)
# ...
for line in f1:
    # ...
    for line1 in l2:
        # ...
于 2013-02-06T20:23:04.637 に答える
0

標準ライブラリdifflibは行の比較に役立ち、おそらくそれを活用できます。

于 2013-02-06T20:51:48.280 に答える