我是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切换)。
在此先感谢您的帮助
你能至少精确地指出哪个for循环发生了“错误”吗? –
我希望我知道,但我相信它在函数“findgtf”的FOR循环中,因为我从中得到了结果,但只是函数接收到的第一个Id。 因为我的经验不足,我以为我可能会出现一些明显而天真的错误... 对不便,敬请谅解。 – JLLavin
开始的一个地方是通过添加一些打印语句来确保for循环的循环次数与预期的一样多。如果有10个ID,那么你应该看到这个打印10次,如果你的gtf文件中有20行,那么如果你在你的findgtf循环的开始处打印语句,你应该有200行打印行。如果检查出来,那么你的问题很可能来自你的正则表达式搜索 – SirParselot