2015-07-10 110 views
0

我的代碼的目的是讀取文本文件,將行添加到數組中,迭代數組中的每個元素,將元素轉換爲一個字符串,並從csv文件返回包含此字符串的行。我的代碼是:Python嵌套循環以匹配字符串從文本文件到csv文件中的字符串

#Read cvs File from url 
import csv 
import urllib2 
url = 'mycsvfile.csv' 
response = urllib2.urlopen(url) 
cr = csv.reader(response) 

#Read txt File 
import linecache 
fileName = 'myfile.txt' 
myFile = open(fileName,'r') 
list_of_lists = [] 
try: 
    for line in myFile: 
     list_of_lists.append(line.strip()) 

    #Lookup Lines 
    for element in list_of_lists: 
     elementstring=''.join(element) 
     for row in cr: 
      if elementstring in row: 
       print row 


finally: 
    myFile.close() 

該代碼不顯示任何內容。

+1

我看不到任何明顯問題。爲什麼不添加'print repr(elementstring)'和'print repr(row)'來查看元素是否真的匹配? –

+1

順便說一下,你的'list_of_lists'不會包含列表,而只是字符串,所以'''.join'是毫無意義的。另外,爲什麼要創建'list_of_lists',而不是直接迭代文件? –

+1

我同意@tobias_k,並會添加一件事:您是否使用過Python調試器?調試器可以讓你一行一行地查看代碼,並查看每個步驟的所有變量。這是理解你的代碼真正在做什麼的好方法,所以你不必說「它不工作,我不知道爲什麼。」我寫了[這裏有幾個Python調試器](http://stackoverflow.com/a/16474706/1202830)。 –

回答

2

我的猜測是,在csv閱讀器的第一次迭代中,您沒有任何滿足條件的行 - if elementstring in row:(對於第一個elementstring)。在這次迭代之後,你已經耗盡了你的csv,並且它已經到了最後,試圖再次遍歷它不起作用。

嘗試開擴循環外部的URL和CSV和各內部行轉換成一組,然後將它們全部添加到列表中,然後用它來循環 -

#Read cvs File from url 
import csv 
import urllib2 
url = 'mycsvfile.csv' 
response = urllib2.urlopen(url) 
cr = csv.reader(response) 
csvset = [set(i) for i in cr] 

#Read txt File 
import linecache 
fileName = 'myfile.txt' 
myFile = open(fileName,'r') 
list_of_lists = [] 
try: 
    for line in myFile: 
     list_of_lists.append(line.strip()) 

    #Lookup Lines 
    for element in list_of_lists: 
     elementstring=''.join(element) 
     for row in csvset: 
      if elementstring in row: 
       print row 


finally: 
    myFile.close() 
+0

是的,這可能是問題!但是,我會建議將文本文件中的行添加到集合中(如果它不太多),在外部循環中迭代CSV文件,並查找該集合中csv行中的元素。可能會快一點。 –

+0

@Anand S Kumar非常感謝你。它像魔術一樣工作。 – user2842033

+0

@tobias_k我也會嘗試你上面的建議,因爲獲取數據有點慢。 – user2842033