2015-05-18 20 views
2

我需要通過.tsv文件中的Blast結果進行篩選。 過濾器的參數是:根據列值過濾tsv文件以獲得前3個匹配項

  1. 只保留Ë值< 10E-20,忽略其他
  2. 對於每個重疊羣,保存前3 BLAST結果。每個重疊羣不一定有3個,大量重疊羣超過3個。

e值在第三列。

該文件以這種格式保存爲.tsv格式

contig-001  [Enterobacteria phage G4 sensu lato]   9.01988e-168 5418 GCATAC 
contig-001  [Enterobacteria phage ID18 sensu lato]  9.97265e-167 5418 GCATACGAAAAGACAGAATCTC 
contig-002  [Enterobacteria phage ID2 Moscow/ID/2001]  1.10261e-165 5418 GCATACGAAAAGAC 
contig-002  [Enterobacteria phage phiX174 sensu lato]  3.31985e-162 5418 GACTGATCGCAGT 
contig-002  [Enterobacteria phage ID2 Moscow/ID/2001]  7.92015e-156 5418 GCATACGAAAAGAC 
contig-002  [Enterobacteria phage ID18 sensu lato]  2.38469e-152 5418 GCATACGAAAAGAC 
contig-003  [Enterobacteria phage ID2 Moscow/ID/2001]  1.08293e-112 5418 GCATACGAAAAGAC 
contig-003  [Sweetpotato badnavirus A]     0.000593081  6592 CATCGTAGCTGAT 
contig-003  [Dahlia mosaic virus]       0.000593081  6592 CAAGAAGATAGAGAGTCCCACA 

回答

1

假設你要保存結果的核苷酸序列(最後一列),這應該工作:

import csv 
from collections import defaultdict 

threshold = 10E-20 

data = defaultdict(dict) 
with open('path/to/file') as infile: 
    for contig, _ignore, e, _id, nuc in csv.reader(infile, delimiter='\t'): 
     contig = int(contig.split('-')[1]) 
     e = float(e) 
     if e < threshold: continue 
     data[contig][e] = nuc 
     if len(data[contig]) > 3: data[contig].pop(min(data[contig])) 

for contig,d in data.items(): 
    for e in sorted(d): 
     print(contig, e, d[e]) 
+0

謝謝你非常。這幫助了很多! –

相關問題