从文件中获取序列并将它们存储在python中的列表中

时间:2015-11-17 16:36:42

标签: python bioinformatics itertools

这是代码(我从这个讨论Translation DNA to Protein中得到了它,但这里我使用的是RNA而不是DNA文件):

from itertools import takewhile

def translate_rna(sequence, d, stop_codons=('UAA', 'UGA', 'UAG')):
    start = sequence.find('AUG') 

    # Take sequence from the first start codon
    trimmed_sequence = sequence[start:]

    # Split it into triplets
    codons = [trimmed_sequence[i:i + 3] for i in range(0, len(trimmed_sequence), 3)]

    # Take all codons until first stop codon
    coding_sequence = takewhile(lambda x: x not in stop_codons and len(x) == 3, codons)

    # Translate and join into string
        protein_sequence = ''.join([codontable[codon] for codon in coding_sequence])

    # This line assumes there is always stop codon in the sequence
    return "{0}".format(protein_sequence)

调用translate_rna函数:

sequence = ''
for line in open("to_rna", "r"):
    sequence += line.strip()

translate_rna(sequence, d)

我的to_rna文件如下:

CCGCCCCUCUGCCCCAGUCACUGAGCCGCCGCCGAGGAUUCAGCAGCCUCCCCCUUGAGCCCCCUCGCUU
CCCGACGUUCCGUUCCCCCCUGCCCGCCUUCUCCCGCCACCGCCGCCGCCGCCUUCCGCAGGCCGUUUCC
ACCGAGGAAAAGGAAUCGUAUCGUAUGUCCGCUAUCCAG.........

该函数仅转换第一个蛋白质(从第一个AUG到第一个stop_codon

我认为问题出在这一行:

# Take all codons until first stop codon
coding_sequence  =  takewhile(lambda x: x not in stop_codons and len(x) == 3 , codons)
  

我的问题是:我如何告诉python(在找到第一个AUG并将其作为列表存储到coding_sequence后)再次搜索 AUG在RNA文件中并将其放在下一个位置。

结果,我想有一个这样的清单:

['here_is_the_1st_coding_sequence', 'here_is_the_2nd_coding_sequence', ...]

PS:这是一个家庭作业,所以我不能使用Biopython。

修改

描述问题的简单方法:

从这段代码:

from itertools import takewhile

lst = ['N', 'A', 'B', 'Z', 'C', 'A', 'V', 'V' 'Z', 'X']
ch = ''.join(lst)

stop = 'Z'
start = ch.find('A')

seq = takewhile(lambda x: x not in stop, ch)

我想得到这个:

['AB', 'AVV']

编辑2:

例如,从这个字符串:

UUUAUGCGCCGCUAACCCAUGGUUCCCUAGUGGUCCUGACGCAUGUGA

我应该得到结果:

['AUGCGCCGC', 'AUGGUUCCC', 'AUG']

1 个答案:

答案 0 :(得分:1)

查看你的基本代码,因为我无法完全遵循你的主要内容,看起来你只想在另一个字符串的所有出现时拆分你的字符串,并从另一个字符串的索引开始对字符串进行子串。如果这是错的,请告诉我,我可以相应更新。

为了实现这一点,python有一个内置str.split(sub),它会在sub的每个出现时拆分一个字符串。此外,它有一个str.index(sub),它返回sub的第一个索引。例如:

>>> ch = 'NABZCAVZX'
>>> ch[ch.index('A'):].split('Z')
['AB', 'CAV', 'X']

您还可以指定不仅仅是一个字符的子字符串:

>>> ch = 'NACBABQZCVEZTZCGE'
>>> ch[ch.index('AB'):].split('ZC')
['ABQ', 'VEZT', 'GE']

使用多个分隔符:

>>> import re
>>> stop_codons = ['UAA','UGA','UAG']
>>> re.compile('|'.join(stop_codons))\
>>> delim = re.compile('|'.join(stop_codons))
>>> ch = 'CCHAUAABEGTAUAAVEGTUGAVKEGUAABEGEUGABRLVBUAGCGGA'
>>> delim.split(ch)
['CCHA', 'BEGTA', 'VEGT', 'VKEG', 'BEGE', 'BRLVB', 'CGGA']

请注意,拆分没有优先顺序,即如果在UGA之前有UAA字符串,它仍会在UGA上拆分。我不确定那是不是你想要的,但就是这样。