2012-07-24 114 views
4

我看不到這裏的問題,它讓我瘋狂。我正在循環2個文本文件。每個文件中的一些行匹配,有些則不匹配。我正在做的是循環file1。對於該文件中的每一行,循環訪問file2並比較每個元素以查看它們是否相同。發生什麼事是我的循環在第一次通過file1循環後停止。這是我的代碼:簡單的嵌套循環無法正常工作

while f < 50: 
    for line in file1: 
     for name in file2: 
      if name == line: 
       print 'a match was found' 
    f+=1 

while循環來自其他地方,但它工作正常。我只是將它包含在上下文中。問題是file1只給我第一行,將它與file2中的所有'名稱'進行比較,然後停止,而不是重複file1中下一行的過程。我是否缺少明顯的東西?

編輯:如果我把打印語句中的第一個for循環後for循環註釋掉其他它遍歷整個第一文件

+1

值得注意的是,爲了達到這個目的,「f + = 1」需要縮進一級 - 我認爲這是一個複製錯誤。 – 2012-07-24 16:18:23

+0

@Lattyware正確的複製錯誤感謝您指出這一點 – adohertyd 2012-07-24 16:19:37

+0

您是比較兩個文件中的所有行50次?我以爲你想找到50場比賽.. – 2012-07-24 16:22:54

回答

9

你可以通過一個文件不循環,然後遍歷相同的文件再次沒有尋求開始。

重新打開file2,在file2上調用.seek(0)或將所有行加載到列表中,然後循環顯示。

在特定情況下,使用該名稱的set可能將是最快的:

names = set(name.strip() for name in file2) 
while f < 50: 
    for line in file1: 
     if line.strip() in names: 
      f += 1 

你可以做同樣的file1中的行,做一個交集,只要線在file1和file2中都是唯一的。

+0

謝謝你。我一直在想這個!我知道這不是最有效的代碼,但它僅用於測試目的,所以我只需要它的工作。謝謝 – adohertyd 2012-07-24 16:18:43

+0

目前還不清楚你是否只是比較匹配線。如果你只想比較匹配的行,你可能想使用'zip(file_1,file2)'並迭代它。 – Julian 2012-07-24 16:19:54

+0

@Julian我其實在做每一個匹配和不匹配的行用於統計目的的數量,使得有每一行從每個文件 – adohertyd 2012-07-24 16:21:16

4

問題可能是,一旦你重複了file2,它已經耗盡,所以你的內循環不再執行(因爲file2中沒有任何內容可以迭代)。您可以每次通過循環關閉/重新打開file2,或者可以在執行循環之前回溯到開始。

一個稍微好一點的方法是使用集(如果文件不是太大,你不擔心文件或命令中重複):

matches = set(file1).intersection(file2) 

這應該只讀文件1成內存,並隱式執行file2上的循環。

+0

你不需要直接創建他們兩個,你可以使用'設置(文件1).intersection(文件2)',你只需要在內存中創建一個'set'。 – Julian 2012-07-24 16:22:30

+0

@Julian - 好點。我會更新。 – mgilson 2012-07-24 16:23:47

1

之後的第一時間內循環結束後,在文件2內迭代器到達最終使該解決方案是指文件2的內部迭代,每次到文件的開頭,例如:

while f < 50: 
    for line in file1: 
     file2.seek(0, 0) 
     for name in file2: 
      if name == line: 
       print 'match!' 
+0

你先生,救了我一天 – 2014-08-21 08:45:28

0

根據您可以使用readlines()函數將每個文件的行讀取到列表中。

然後,遍歷這些列表。這將確保您不會遇到文件位置當前位置的問題。