2015-07-10 46 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

相关问题