2012-10-30 38 views
1

我想匹配一個文本文件的行與另一個文本文件,一行行,有一個問題,我的嵌套for循環,它必須是簡單的,但我可以「找不到它,python從兩個文件中嵌套for循環的行

for line1 in ratings: 
    cont1+=1 

    for line2 in movies: 
     cont2+=1 
     print(cont1,cont2) 

我簡化它這個循環,檢查錯誤, 外環未達到續= 2,

1 1 
1 2 
1 3 
1 4 
1 5 
1 6 
1 7 
. 
. 
. 
1 157 
>>> 
+2

你的描述和計劃似乎是相互矛盾的,這將產生從''movies''每行從''ratings''每一行 - 我想你想要的是''拉鍊()''或'' itertools.zip_longest()''將第一行與第一行匹配,第二行與第二行匹配,等等...... –

+0

我沒有很好地解釋它,我很抱歉。我的主要問題是,我不明白爲什麼這個嵌套循環可以正常工作,並且可以很好地迭代兩個字符串,爲什麼這對於文件不起作用,並且獲得索引1中的外部循環? – user1700959

+0

我會假設你的文件只有一行。請給出你的所有代碼和文件內容,否則我們不能多說。 –

回答

1

的問題是,我需要重置與內環尋求(0),這樣做循環正常工作,感謝大家的答覆。

5

需要遍歷這兩個文件同時

ratings= open('ratings.txt') 
movies= open('movies.txt') 

for rating, movie in itertools.izip(ratings, movies): 
    # do task 

ratings= open('ratings.txt').readlines() 
movies= open('movies.txt').readlines() 

for rating, movie in zip(ratings, movies): 
    # do task 
+0

爲什麼'itertools.zip'?哪個版本的python是這個? – SilentGhost

+0

哎呀..在'izip'中錯過了'i' ...糾正:) – avasal

+2

爲什麼使用''readlines()''而不是迭代文件?它使用''izip()''毫無意義。此外,這種文件是相同的長度,或者你不介意被截斷。 –

0

您實現運行在文件1運行file2中的所有行的每一行,

實際的代碼SHD是,

for line1,line2 in zip(ratings,movies): 
cont1+=1 
cont2+=1 
print(cont1,cont2) 
+0

假定文件長度相同,或者您不介意被截斷。 –

0
with open('ratings.txt') as ratings, open('movies.txt') as movies: 
    for rating, movie in itertools.izip(ratings, movies): 
     # do task 

這是一種進步在avasal's answer因爲它迭代地拾取線(相當於舊的xreadlines,不是棄用)而不是閱讀via readlines()中的所有行。所以它應該從每一行讀取一行,然後對它們進行處理,然後讀取另一行等,從而允許Files Of Enormity將readlines實現限制爲較小的文件。

請注意,izip會一直繼續,直到其中一個迭代器停止,因此只會獲得與較短文件相同數量的行。不過,我認爲這是正確的,因爲代碼隱含地假定兩個文件匹配。

+0

你爲什麼要做''g_read()''?它確實沒有任何東西。你也應該使用''with''語句來打開文件。 –

+0

@Lattyware:你有一個觀點,我忘了開放的結果是可迭代的。我還認爲'with'只能帶上1個上下文,但顯然在2.7.3中可以像上面那樣採用多個上下文。所以,歡呼聲。 –