2015-10-19 195 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