程序没有给我我想要的输出

时间:2014-12-02 12:56:19

标签: python

我有一个正在阅读文件的程序'侧翼seqs'其中包含每个含义不同的文本列:

1   1   44457990    TAA CTCTCCTAAAGGACC
1   1   44461833    TGA CCAGCCTGAAGGGCT
1   1   148594641   TAA CCACAATAAGCAGCT
1   1   43241066    TGA ACTCACTGAGAGTGG
1   1   43240880    TAG CTTCTCTAGGAATGG ...

第一个col:染色体编号,第二个col:DNA链,第三个col:DNA中终止密码子的位置,第四个col:终止密码子,第五个col:终止密码子周围上游和下游的6个碱基,即每个的侧翼序列终止密码子。

现在,我的程序应该读取该文件并从侧翼序列列中提取每个终止密码子之前和之后的3个碱基,并写入包含两个列的文件:终止密码子,然后是侧翼序列。该文件应包含所有三个终止密码子TAA,TAG和TGA的侧翼序列,但是当我运行该程序时,它只给出了TGA终止密码子的侧翼序列,但不是其余的。

以下是outfile的示例:

TGA GGGCTT  1
TGA GAACGT  2
TGA CTTCTT  17
TGA CACCCT  15
TGA GAACGG  1
TGA GAACGC  3

我无法看到我出错的地方,但我没有经验,所以我确定我错过了一些简单的事情。我发现我的错误,感谢您的帮助!这是代码:

bases = ['A','T','C','G']
sequenceCount = {}
for x1 in bases:
    for x2 in bases:
        for x3 in bases:
            for x4 in bases:
                for x5 in bases:
                    for x6 in bases:
                        sequenceCount[x1+x2+x3+x4+x5+x6] = 0 
infile = open('flanking seqs.txt','rU')
outfile = open('context resultsNEW.txt','w')

for line in infile:
    parts = line.split('\t') 
    chromosome = parts[0] 
    position = int(parts[2])
    stopcodon = parts[3]
    flankseq = parts[4].strip()
    flankseq = flankseq[3:6]+flankseq[9:12]
    if flankseq in sequenceCount:  
        sequenceCount[flankseq] += 1    
for s in sequenceCount:   
    outfile.write(stopcodon+'\t'+s+'\t'+str(sequenceCount[s])+'\n')

2 个答案:

答案 0 :(得分:2)

您的outfile.write发生在for line in infile循环之外,因此stopcodon的值始终是输入文本文件最后一行中的值。

如果您尝试将序列计数与终止密码子和侧翼序列相关联,则需要将两个变量用作关键字。如果你不提前知道所有的终止密码子,你将无法使用“多个嵌套for循环”方法将sequenceCount的值初始化为0,所以你应该使用defaultdict。 / p>

from collections import defaultdict
sequenceCount = defaultdict(int)

infile = open('flanking seqs.txt','rU')
outfile = open('context resultsNEW.txt','w')

for line in infile:
    parts = line.split('\t') 
    chromosome = parts[0] 
    position = int(parts[2])
    stopcodon = parts[3]
    flankseq = parts[4].strip()
    flankseq = flankseq[3:6]+flankseq[9:12]
    sequenceCount[flankseq, stopcodon] += 1
for key, value in sequenceCount.iteritems():
    flankseq, stopcodon = key
    outfile.write(stopcodon+'\t'+s+'\t'+str(sequenceCount[s])+'\n')

答案 1 :(得分:0)

当您生成输出时,无论前一循环中使用stopcodon的值是什么,都会打印从文件中读取的最后一行stopcodon。也许您的sequenceCount字典需要通过stopcodonflankseq的组合编制索引?