2013-04-08 46 views
0

我只會深入解釋我的編程問題:我有兩個文件;文件#1是基因註釋文件,文件#2是基準位置文件計數(只是試圖給出問題的上下文)。使用python中的兩個文件中的信息計算以前的行

我想在第6列有一個「+」的行中提取「start_codon」位置,然後轉到文件#2中的那個位置。例如,我想從文件#1中的列號3中提取954,並轉到文件#2中的行號954。然後,我要計算文件#2中第954行之上的行數,計數值爲70或更大。

File#1 

    Chromosome exon 337 774 0.0 - . gene_id "A";  
    Chromosome start_codon 954 956 0.0 + 0 gene_id "B"; 
    Chromosome stop_codon 2502 2504 0.0 + 0 gene_id "B"; 

File#2 
.  . 
.  . 
942 71 
943 63 
944 88 
945 80 
946 80 
947 85 
948 86 
949 97 
950 97 
951 97 
952 104 
953 105 
954 104 
955 108 

我的最終輸出文件將是gene_id後跟得到的70或更大的計數值的行數的製表符分隔的文件。對於我給出的示例文件,輸出如下:

Gene_id Count_before_start_codon 
B  10 

我想通過大文件循環生成一個長輸出文件。

謝謝,我希望這很清楚。我很欣賞任何指導!

+0

爲了減少編碼工作,你可以'grep'^ +'inputfile> script.py'來處理匹配的行,並將一些工作轉移到內置grep的。 – 2013-04-09 01:12:36

回答

0

這應該工作... 第一部分獲取文件1中的基因信息並填充字典 第二部分打開文件2,檢查字典並生成輸出。

D={} 
with open("file1.txt","rU") as f1: 
    for line in f1: 
     line=line.rstrip().rsplit("\t") 
     if line[6]=="+" and line[2]=="start_codon": 
      D[line[3]] = line[8].rstrip('"')[9] 
      keys = D.keys() 

count=[] 
results=[] 
number = 12 
with open("file2.txt","rU") as f2: 
    for line in f2: 
     line=line.rstrip().rsplit("\t") 
     if int(line[1]) >= 70: 
      count.append(line[1]) 
      if line[0] in D: 
       results.append(D[line[0]]) 
       if len(count) > number: 
        results.append(str(number)) 
       else: 
        results.append(str(len(count)-1)) 
       print "\t".join(results) 
       count=[] 

     else: 
      count=[] 

ps。我複製粘貼你的例子。我編輯了文件以製表符分隔。所以你可能需要玩弄「切分」

+0

謝謝,這真的很棒。我唯一的問題是,無論計數是否大於70,輸出似乎都在增加。我可能不清楚的是每個基因在它上面有不同數量的直線,直到計數值達到70以下。例如,在我的例子中,基因B應該有10條直線,直到數值低於70 ,但基因A可能有400行以上,直到一行達到70以下。 – C9r1y 2013-04-09 20:28:04

+0

我編輯了代碼。如果我正確地理解了你,這應該做到這一點。此代碼假定「954」將具有70以上的值... – Stylize 2013-04-09 21:03:18

+0

再次感謝。唯一的問題是,當我嘗試執行int(line [1])> = 70時,我得到錯誤「無效的int基數爲10的字面值:'position'」。對此有什麼想法?文件中沒有空白條目,所以我很困惑爲什麼它無法轉換爲int。 – C9r1y 2013-04-09 21:40:35

0

如果你想保持簡單並假設文件2不是很大,你可以將文件2加載到一個numpy數組中,它可以讓你快速訪問任何位置。例如,如果你把它加載到陣列AR和希望位置p之前進行搜索,你可以這樣做:

numpy.sum(ar[:p]>=70) 

這會給你你正在尋找

的號碼,然後你可以通過文件# 1並在飛行中進行計算。這樣你只需要讀一次文件,它應該很快。

+0

是的,我的問題是行位置不符合我想要開始計數的開始位置。我該如何在numpy內糾正這個問題?謝謝! – C9r1y 2013-04-09 20:29:31

+0

@ C9r1y你的問題指出,如果文件1說954位置,那麼你想要去文件2中的954行。這意味着位置954是在954行。 – Bitwise 2013-04-09 20:45:35

+0

我想我應該說去以954開頭的行在這個例子中。我的錯。 – C9r1y 2013-04-09 21:43:43

相關問題