2013-09-01 72 views
12

我有兩個製表符分隔的文件,我需要測試第一個文件中的每一行對其他文件中的所有行。例如,如何突破只有一個嵌套循環

文件1:

​​3210

文件2:

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

比方說,我想輸出(文件1)對於這山坳[3]文件1的小於所有行考慮到col [1]是相同的,file2的任何(不是每個)col [2]。

預期輸出:

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循環,以及(2)如果這是我在這裏得到的唯一問題。

+1

'break'只會讓你跳出最內層循環。 –

+0

相關:[比較兩個文件,並寫入一個新的文件,但只輸出幾行?](http://stackoverflow.com/questions/18514979/compare-two-files-and-write-to-a-new-文件,但只輸出-A-幾線) –

回答

19

breakcontinue適用於最內圈。

問題是您只打開第二個文件一次,因此它只能讀取一次。當您第二次執行for y in file2.readlines():時,file2.readlines()會返回空的可迭代。

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