2013-03-24 69 views
1

行我有2個文件的格式如下:比較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)是equal..I要比較的後續部分並打印找到差異的行。例如。

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」的應該怎麼讀取文件平行

+0

讀入內存(每個r.read()和w.read()到一個變量),然後做比較。並行不是正確的詞。 – CppLearner 2013-03-24 18:17:22

+0

CppLearner該方法是可行的,只有當我的文件不大的大文件的方法是不可行的 – user1778824 2013-03-24 18:19:32

+0

好點。那麼,如果你確定像'work1'這樣的頭文件不會在同一個文件中重複出現,那麼你可以打開這個文件並且讀取出現子字符串的位置,然後結束並且出現下一個頭文件。將它們記錄在兩個文件中然後閱讀。我不知道性能如何與這兩個文件讀入同一個迭代器相比較http://stackoverflow.com/questions/3322419/iterate-across-lines-in-two-files-simultaneously-in-python。 – CppLearner 2013-03-24 18:33:36

回答

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 
1

你可能會想嘗試在Python itertools模塊。 它包含一個名爲izip的功能,可以執行您所需的功能,以及名爲islice的功能。您可以遍歷第二個文件,直到找到您正在查找的標題,然後可以將標題切分。

這是一段代碼。

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的末尾時停止。

希望我解釋得很好。

編輯:添加了導入語句。

編輯:我們需要重新打開file2。這是因爲在Python中迭代迭代器會消耗迭代器。所以,我們需要通過一個全新的islice,所以它的工作原理!

+1

'islice(w,i,None,1)'從文件當前位置開始跳過'i'行。 – 2013-03-24 19:02:42

+0

@AVP感謝您的回覆......請您解釋「islice」的功能。其實它給我錯誤..名字'islice'沒有定義。另外我已經導入itertools..still我不知道爲什麼它會拋出錯誤 – user1778824 2013-03-24 19:07:16

+0

你在做itertools.islice或者你在做islice嗎? 第二個只有在你的import語句是「from itertools import *」時才能工作,而第一個會在你執行「import itertools」時工作。 – AVP 2013-03-24 19:12:02