0

我对 Python还很陌生,我的for循环有一个问题,我似乎不太明白。

我正在尝试读取具有以下示例文本的 FASTA 文件:

>seq1
AAACTACCGCGTTT
>seq2
AAACTGCAACTAGCGTTT
>seq3
AAACCGGAGTTACCTAGCGTTT

我想做的是读入我的文件并打印 FASTA 标题(例如标题>seq1),然后我想匹配 DNA 序列中存在的两个独特模式(例如“AAA”和“TTT”)和打印这两种模式之间的 DNA 序列。

所以我希望我的输出看起来像这样:

>seq1
CTACCGCG
>seq2
CTGCAACTAGCG
>seq3
CCGGAGTTACCTAGCG

我有以下代码:

import re
def find_seq(filename):
    with open(filename) as file:
       seq=''
       for line in file:
            header = re.search(r'^>\w+', line)
            if(header):
                print (header.group())
                seq = seq.replace('\n','')
                find_Lpattern = re.sub(r'.*AAA', '',seq)
                find_Rpattern = re.sub(r'TTT.*', '',find_Lpattern)
                if(find_Rpattern):
                    print (find_Rpattern)
                    seq = ''
                else:
                    seq += line
filename = 'test.txt'
print(find_seq(filename))

我一直把它作为我的输出:

>seq1
>seq2
CTACCGCG
>seq3
CTGCAACTAGCG

本质上,我的 for 循环跳过了 seq1,然后将 DNA 序列从 seq1 分配给 seq2,我的 for 循环上的迭代关闭。谁能指出我正确的方向,以便我解决这个问题?

4

1 回答 1

2

即使假设您的缩进是以产生您描述的结果的方式设置的,您的逻辑也是错误的。在处理累积的seq.

当您阅读文件的第 1 行时,您的正则header表达式匹配。此时,seq是空字符串。因此,它会打印匹配项,并运行您的替换并re.sub调用空字符串。

然后它读取第 2 行“AAACTACCGCGTTT”,并将其附加到seq.

然后它读取第 3 行,">seq2"。这与您的标头正则表达式匹配,因此它会打印标头。然后在运行你的替换和子调用seq- 这仍然是第 2 行的“AAACTACCGCGTTT”。

您需要seq在打印标题之前将处理移动到,并考虑当您在未找到最终标题的情况下运行文件末尾时会发生什么 - 您仍然会有“seq”内容要在您之后解析和打印for 循环已经结束。

或者也许查看第三方生物模式库,其中包含SeqIO解析 FASTA 文件的模块。

于 2013-11-11T22:15:29.073 回答