2011-06-27 58 views
0

有人可以幫助我解決這個嵌套循環嗎?它具有與Loops not working - Strings (Python)相同的問題,但現在它在csv類中沒有csv.readline()函數。再一次,如何讓嵌套循環在python中工作

import csv 
import sys, re 
import codecs 
reload(sys) 
sys.setdefaultencoding('utf-8') 

reader = csv.reader(open("reference.txt"), delimiter = "\t") 
reader2 = csv.reader(open("current.txt"), delimiter = "\t") 

for line in reader: 
    for line2 in reader2: 
     if line[0] == line2[1]: 
      print line2[0] + '\t' + line[0] 
      print line[1] 
     else: 
      print line[0] 
      print line[1] 

此代碼的目的是檢查在與當前文本文件(即閱讀器)一致的參考文本(即reader2)的行。然後打印序列號,也就是在reference.txt

reference.txt看起來像這樣(的序列號之間的空間和句子是tab):

S00001LP this is a nested problem 
S00002LP that cannot be solved 
S00003LP and it's pissing me off 
S00004LP badly 

current.txt樣子本(第1和第2句之間的空間是):

this is a nested problem wakaraa pii ney bay tam 
and i really can't solve it shuu ipp faa luiip 
so i come to seek help from stackoverflow lakjsd sdiiije 
seriously it is crazy because such foo bar bar foo 
problems don't happen in other languages whaloemver ahjd 
and it's pissing me off gaga ooo mama 
badly wahahahah 

所需的輸出會是這個樣子:

S00001LP this is a nested problem wakaraa pii ney bay tam 
and i really can't solve it shuu ipp faa luiip 
so i come to seek help from stackoverflow lakjsd sdiiije 
seriously it is crazy because such foo bar bar foo 
problems don't happen in other languages whaloemver ahjd 
S00003LP and it's pissing me off gaga ooo mama 
S00004LP badly wahahahah 
+4

'不工作'是沒有錯誤的描述。 – Bobby

+4

[Select is not broken](http://lingpipe-blog.com/2007/06/27/select-isnt-broken-or-horses-not-zebras/) - Python的循環工作得很好。 –

回答

6

您只能從一個流中讀取一次。你的內部循環過快地消耗第二個文件,而你的外部循環的其他迭代沒有機會再次讀取第二個文件。

嘗試修改此:

reader = csv.reader(open("reference.txt"), delimiter = "\t") 
reader2 = csv.reader(open("current.txt"), delimiter = "\t") 

這樣:

reader = list(csv.reader(open("reference.txt"), delimiter = "\t")) 
reader2 = list(csv.reader(open("current.txt"), delimiter = "\t")) 

list()將完整地閱讀文件,創建從它在內存中的列表,然後你就可以遍歷爲很多次你喜歡。

更好的解決方案是將參考數據存儲在字典中,以便您不必爲數據中的每一行循環使用參考數據。

+0

令人驚歎,它在普通文件閱讀器中像readline()一樣工作。內德,你能解釋一下爲什麼列表會起作用嗎?是因爲它將文件讀入由\ n分割的列表中? – alvas

+0

所有列表都會迭代其參數,並將值存儲在列表中。它對文件,換行符等一無所知。只是一系列值。 –

4

一種方法是創建一個字典映射你的鑰匙序列號:

serials = dict(map(reversed, reader)) 
for line in reader2: 
    serial = serials.get(line[0]) 
    if serial is not None: 
     print serial 

這將是比嵌套循環快得多。

第一行創建詞典映射鍵到序列號。由於字典構造函數期望(鍵,值)對的迭代對,而文件實際上包含(值,鍵)對,所以我們必須交換每條記錄中的兩個條目 - 這就是map(reversed, ...)所做的。

+0

謝謝Sven,當我的文本文件變大時,這似乎是更好的解決方案,現在它大約有2500行。你能解釋一下這條線路在做什麼嗎? 「連續劇=字典(地圖(顛倒,閱讀器))」 – alvas

+0

@ 2er0:更新了我的答案。 –