使用python中两个文件的信息计算前一行

时间:2013-04-08 21:57:29

标签: python list python-2.7 count bioinformatics

我将深入研究解释我的编程问题:我有两个文件;文件#1是基因注释文件,文件#2是基本位置文件计数(只是试图给出问题的某些上下文)。

我想在第6列中有“+”的行中提取“start_codon”位置,然后转到文件#2中的那个位置。例如,我想从文件#1中的第3列中提取954并转到文件#2中的第954行。然后,我想计算第954行以上的行数,这些行在文件#2中产生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

我想遍历大文件以生成一个长输出文件。

谢谢,我希望这很清楚。我感谢任何指导!

2 个答案:

答案 0 :(得分:0)

如果你想保持简单并假设文件2不是很大,你可以将文件2加载到一个numpy数组中,这样你就可以非常快速地访问任何位置。例如,如果将其加载到数组ar并想要在位置p之前搜索,则可以执行以下操作:

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

这将为您提供您正在寻找的号码

然后你可以浏览文件#1并动态进行计算。这样你只需要读取一次文件,它应该很快。

答案 1 :(得分: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。我复制粘贴你的例子。我编辑了文件以制表符分隔。所以你可能需要玩“切片”