2017-02-15 131 views
0

我有2個這樣的文件。如何循環和比較行對?

文件1

e 1 0 ppp 
e 3 1 rrr 
e 3 2 rrr 

文件2

e 1 0 rrr 

我想要分割的代碼的每一行比較陣列[3]它應該打印OK如果在線路相同RRR。我寫這樣的代碼。

file1 = open('file1.txt', 'r', encoding="utf8") 
file2 = open('file2.txt', 'r') 

for line1 in file1:  #loop file1 

    L1 = line1.split() #split to array 

    if(L1[0] == 'e'): 
     print("line1 " + line1) 

     for line2 in file2: #loop file2 

      L2 = line2.split() #split to array 

      if(L2[0] == 'e'): 
       print("line2 " + line2) 

       if(L2[3] == L1[3]): #check rrr same 

        print("OK") 

當我運行的代碼,它打印此:

line1 e 1 0 ppp 
line2 e 1 0 rrr 
line1 e 3 1 rrr 
line1 e 3 2 rrr 

的代碼迴路中循環我想顯示的結果是這樣的:

line1 e 1 0 ppp 
line2 e 1 0 rrr 
line1 e 3 1 rrr 
line2 e 1 0 rrr 
line1 e 3 2 rrr 
line2 e 1 0 rrr 

如何修改代碼進行比較文件的每一行?

+3

文件對象的迭代器只對一個合格好。我相信這是你的問題。 –

回答

0

基本上你需要跟蹤兩個文件的最後一行。如果任何文件較小並且在另一個之前完成迭代,則爲incase。 您需要將當前行與其他文件中的上一行進行比較。

這個怎麼樣?

prev_f1_token = None 
prev_f1_line = None 

prev_f2_token = None 
prev_f2_line = None 

with open('file1.txt') as f1: 
    with open('file2.txt') as f2: 
     for line in f1: 
      prev_f1_token = line[0] 
      prev_f1_line = line 
      for line in f2: 
       prev_f2_token = line[0] 
       prev_f2_line = line 

      if(prev_f1_token == 'e'): 
       print("line1 ", prev_f1_line) 

      if (prev_f2_token == 'e'): 
       print ("line2 ", prev_f2_line) 

       if(prev_f2_line.split()[3] == prev_f1_line.split()[3]): #check rrr same 
         print("OK") 
0

你正在寫的方式太多的代碼比它是必需的,它並不總是一個好主意,繼續,如果你的代碼越來越那麼多縮進。這是我試圖打印你想要的,我相信這可以縮短更多!

您可以使用itertools.cycle這裏(它在更短名單的情況下返回一個循環迭代器)

import itertools 
f1, f2 = open('file1.txt', 'r'), open('file2.txt', 'r') 
file1, file2 = f1.read().split(), f2.read().split() 
if len(file1) > len(file2): 
    file2 = itertools.cycle(file2) 
else: 
    file1 = itertools.cycle(file1) 
print '\n'.join(['line1 '+i+'\nline2 '+j for i,j in zip(file1, file2)]) 
f1.close();f2.close()