2つのタブ区切りファイルがあり、最初のファイルのすべての行を他のファイルのすべての行に対してテストする必要があります。例えば、
file1:
row1 c1 36 345 A
row2 c3 36 9949 B
row3 c4 36 858 C
file2:
row1 c1 3455 3800
row2 c3 6784 7843
row3 c3 10564 99302
row4 c5 1405 1563
col [1]が同じである場合、file1のcol [3]がfile2のcol [2]よりも小さい(file1)のすべての行を出力するとします。
期待される出力:
row1 c1 36 345 A
row2 c3 36 9949 B
Ubuntuで作業しているので、入力コマンドを次のようにしたいと思います。python code.py [file1] [file2] > [output]
私は次のコードを書きました:
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
ただし、出力は次のようになります。
row2 c3 36 9949 B
これは、より大きなデータセットでは明らかですが、基本的に、ネストされたループの条件が真であった最後の行のみを常に取得します。 「ブレイク」が両方のループから抜け出しているのではないかと疑っています。 (1)forループの1つだけから抜け出す方法、および(2)これが私がここで持っている唯一の問題であるかどうかを知りたいです。
break
およびcontinue
は、最も内側のループに適用されます。
問題は、2番目のファイルを1回だけ開くため、1回しか読み取れないことです。 for y in file2.readlines():
を2回目に実行すると、file2.readlines()
は空のイテラブルを返します。
file2 = open(filename2, 'r')
を外側のループに移動するか、seek()
を使用してfile2
の先頭に巻き戻します。
数値文字列を対応する整数値に解析する必要があります。
次のように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