2015-10-19 262 views
-3

我是Python新手,我似乎没有从FOR循环中获得正确的行为。Python函数和for循环

我已经有了IDS的名单,我想重复一个“.gtf”文件制表符分隔的多行),并从中提取对应于那些IDS一些值。

看来,正则表达式的构造不能在findgtf函数内正常工作。从第二次迭代开始,传递给函数的“id”变量不会用于“sc”变量的正则表达式模式,并且随后模式匹配不起作用。在每次迭代之前是否需要重新初始化变量“id”或/和“sc”? 我的话,你能告诉我如何实现这一

这里的是代码:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import sys, os, re 
#Usage:gtf_parser_4.py [path_to_dir] [IDlist] 

#######FUNCTIONS###################################### 

def findgtf(id, gtf): 

    id=id.strip()#remove \n 
    #print "Received Id: *"+id+"* post-stripped" 

    for line in gtf: 
     seq, source, feat, start, end, score, strand, frame, attribute = line.strip().split("\t") 
     sc = re.search(str(id), str(attribute)) 

     if sc: 

      print "Coord of "+id+" -> Start: "+str(start)+" End: "+str(end) 

###########################MAIN######################### 
#Arguments retieval 
mydir = sys.argv[1] 
#print"Directory : "+mydir 
IDlist = sys.argv[2] 
#print"IDlist : "+IDlist 
path2ID = os.path.join(mydir, IDlist) 
#print"Full IdList: "+path2ID 
#lines to list 
IDlines = [line.rstrip('\n') for line in open(path2ID)] 

#Open and read dir 
for file in os.listdir(mydir): 
    if file.endswith(".gtf"): 

     path2file = os.path.join(mydir, file) 
     #print"Full gtf : "+path2file 
     gtf = open(path2file,"r") 

     for id in IDlines: 
      print"ID submitted to findgtf: "+id 
      fg = findgtf(id, gtf) 
     gtf.close() 

这里是从控制台(提交了IDLIST检索与3个IDS结果:LX00_00030,gyrB基因, LX00_00065):

ID submitted to findgtf: LX00_00030 
    Coord of LX00_00030 -> Start: 4299 End: 5303 
    ID submitted to findgtf: gyrB 
    ID submitted to findgtf: LX00_00065 

正如你所看到的第一个ID工作正常,但第二第三的不产生任何结果(虽然他们做,如果他们的订单在IDLIST切换)。

在此先感谢您的帮助

+2

你能至少精确地指出哪个for循环发生了“错误”吗? –

+0

我希望我知道,但我相信它在函数“findgtf”的FOR循环中,因为我从中得到了结果,但只是函数接收到的第一个Id。 因为我的经验不足,我以为我可能会出现一些明显而天真的错误... 对不便,敬请谅解。 – JLLavin

+1

开始的一个地方是通过添加一些打印语句来确保for循环的循环次数与预期的一样多。如果有10个ID,那么你应该看到这个打印10次,如果你的gtf文件中有20行,那么如果你在你的findgtf循环的开始处打印语句,你应该有200行打印行。如果检查出来,那么你的问题很可能来自你的正则表达式搜索 – SirParselot

回答

0

您的代码不工作,因为你正在试图多次迭代相同的文件对象。一个文件记录你在内部阅读的位置,所以当你阅读到最后时,你就再也看不到了!

为了使您的代码正常工作,您需要seek回到文件的开始位置,然后再次迭代。

for id in IDlines: 
    print"ID submitted to findgtf: "+id 
    gtf.seek(0) # seek to the start of the file 
    fg = findgtf(id, gtf) 
+0

非常感谢@Blckknght,我从来没有想过这个没有你的帮助......这个问题远远超出了我目前对Python的认识...... 所以,每次扫描一个文件时,它都必须重置为“file.seek(0)”,对?有没有办法打开文件,以便它们不需要像我的情况那样重置? 再次感谢 – JLLavin

+0

他们只需要重复迭代之间重置。我在循环的顶部做了它,因为这看起来最简单,但它也在循环结束时起作用。无论在哪种情况下,你都会得到更多的“寻求”。另一种解决方案是将文件中的所有行从列表中读取一次,然后遍历列表(您可以根据需要多次执行)。 – Blckknght

+0

谢谢@Blckknght,那正是我一直在寻找的解决方案。 – JLLavin