2013-09-01 26 views
12

2つのタブ区切りファイルがあり、最初のファイルのすべての行をもう1つのファイルのすべての行に対してテストする必要があります。例えば、ネストされたループを1つだけ中断する方法

FILE1:

​​3210

FILE2:

row1 c1 3455 3800 
row2 c3 6784 7843 
row3 c3 10564 99302 
row4 c5 1405 1563 

のは、私が[3]ファイル1のよりも小さいCOLのために(FILE1)での出力のすべての行したいとしましょうcol [1]が同じであるとすると、file2のcol [2]のいずれか(すべてではない)。

予想される出力:

row1 c1 36 345 A 
row2 c3 36 9949 B 

私はUbuntuの中で働いているので、私はこのように見えるように入力コマンドを希望:

import sys 

filename1 = sys.argv[1] 
filename2 = sys.argv[2] 

file1 = open(filename1, 'r') 
file2 = open(filename2, 'r') 

done = False 

for x in file1.readlines(): 
    col = x.strip().split() 
    for y in file2.readlines(): 
     col2 = y.strip().split() 
     if col[1] == col2[1] and col[3] < col2[2]: 
      done = True 
      break 
     else: continue 
print x 

python code.py [file1] [file2] > [output]

私は、次のコードを書きました

ただし、出力は次のようになります。

row2 c3 36 9949 B 

これは大きなデータセットでは明らかですが、基本的にはネストされたループの条件が真であった最後の行のみを取得します。私は、 "休憩"が両方のループから私を壊していることを疑う。私は、(1)forループのどれかから抜け出す方法、そして(2)これが私がここにいる唯一の問題ならば知りたいです。

+1

「break」は、あなたを最も内側のループから壊すだけです。 –

+0

関連項目:[2つのファイルを比較して新しいファイルに書き込むが、出力は数行だけですか?](http://stackoverflow.com/questions/18514979/compare-two-files-and-write-to-a-new- file-but-only-output-a-few-lines)は、 –

答えて

19

breakおよびcontinueは、最も内側のループに適用されます。

問題は、2番目のファイルを1回だけ開くことです。そのため、1度だけ読み込みます。 for y in file2.readlines():を2回実行すると、file2.readlines()は空のiterableを返します。

file2 = open(filename2, 'r')を外側ループに移動するか、またはseek()を使用してfile2の先頭に巻き戻します。

2

数値文字列を対応する整数値に解析する必要があります。

int('hoge')は次のように使用できます。

import sys 

filename1 = sys.argv[1] 
filename2 = sys.argv[2] 

with open(filename1) as file1: 
    for x in file1: 
     with open(filename2) as file2: 
      col = x.strip().split() 
      for y in file2: 
       col2 = y.strip().split() 
       if col[1] == col2[1] and int(col[3]) < int(col2[2]): 
        print x 
関連する問題