我是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