1

次の形式のファイルが 2 つあります。

file1:
work1
7 8 9 10 11
1 2 3 4  5
6 7 8 9  10

file2:
work2
2 3 4 5 5
2 4 7 8 9
work1
7 8 9 10 11
1 2 4 4  5
6 7 8 9  10
work3
1 7 8 9 10

今、私はファイルと比較したいのですが、ヘッダー(work1)が等しいと言うところならどこでも..後続のセクションを比較して、違いが見つかった行を印刷したいと思います。例えば

 work1 (file1)
7 8 9 10 11
1 2 3 4  5
6 7 8 9  10

work1 (file2)
7 8 9 10 11
1 2 4 4  5
6 7 8 9  10

今、違いが発生する行、つまり「1 2 4 4 5」を印刷したい

そうするために、私は次のコードを書きました:

with open("file1",) as r, open("file2") as w:
    for line in r:
        if "work1" in line:
            for line1 in w:
                if "work1" in line1:
                        print "work1"

ただし、ここからは、両方のファイルを並行して読み取る方法について混乱しています。誰かがこれで私を助けてくれますか...「work1」を比較した後、ファイルを並行して読み取る方法がわからないため

4

2 に答える 2

1

itertoolsモジュールを Python で試してみることをお勧めします。izipと呼ばれる関数とともに、必要なことを実行できると呼ばれる関数が含まれていますislice。探していたヘッダーに到達するまで 2 番目のファイルを反復処理し、ヘッダーをスライスすることができます。

コードの一部を次に示します。

from itertools import *    

w = open('file2')
for (i,line) in enumerate(w):
  if "work1" in line:
    iter2 = islice(open('file2'), i, None, 1) # Starts at the correct line

f = open('file1')
for (line1,line2) in izip(f,iter2):
  print line1, line2 # Place your comparisons of the two lines here.

これで、ループの最初の実行時に、両方の行で「work1」が得られることが保証されます。その後、比較することができます。fは よりも短いため、wイテレータはそれ自体を使い果たし、 の最後に達すると停止しますf

うまくいけば、私はそれをうまく説明しました。

編集: import ステートメントを追加しました。

編集: file2 を再度開く必要があります。これは、Python で iterable を反復処理すると iterable が消費されるためです。isliceそのため、機能するように新しいものを渡す必要があります。

于 2013-03-24T18:52:42.937 に答える
0
with open('f1.csv') as f1, open('f2.csv') as f2 :
    i=0
    break_needed = False
    while True :
        r1, r2 = f1.readline(), f2.readline()
        if len(r1) == 0 :
            print "eof found for f1"
            break_needed = True
        if len(r2) == 0 :
            print "eof found for f2"
            break_needed = True
        if break_needed : 
            break
        i += 1
        if r1 != r2 :
            print " line %i"%i
            print "file 1 : " + r1
            print "file 2 : " + r2
于 2013-03-24T18:40:51.593 に答える