加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

学习用python解析一个fasta文件[复制]

发布时间:2020-12-20 11:42:27 所属栏目:Python 来源:网络整理
导读:参见英文答案 parsing a fasta file using a generator ( python )????????????????????????????????????4个 我正在学习python,我想在不使用BioPython的情况下解析fasta文件.我的txt文件看起来像: 22567CGTGTCCAGGTCTATCTCGGAAATTTGCCGTCGTTGCATTACTGTCCAGC
参见英文答案 > parsing a fasta file using a generator ( python )????????????????????????????????????4个
我正在学习python,我想在不使用BioPython的情况下解析fasta文件.我的txt文件看起来像:

>22567
CGTGTCCAGGTCTATCTCGGAAATTTGCCGTCGTTGCATTACTGTCCAGCTCCATGCCCA
ACATTTGGCATCGGAGAATGACTCCGCGTGATAAAGTCAGAATAGGCATTGAGACTCAGG
GTGGTACCTATTA
>34454
AAAACTGTGCAGCCGGTAACAGGCCGCGATGCTGTACTATATGTGTTTGGTACATATCCG
ATTCAGGTATGTCAGGGAGCCAGCACCGGAGGATCCAGAAGTAAGTCGGGTTGACTACTC
CTAGCCTCGTTTCACCATCCGCCGGATAACTCTCCCTTCCATCATCAACTCCTCCCTTTC
GTGTCCAATGGGGCGGCGTGTCTAAGCACTGCCATATAGCTACCGAAAGGCGGCGACCCC
TCGGA

我想解析这个以保存每个序列的标题,其中> 22567和> 34454到标题列表中(这是有效的).并且在每个标题之后读取下面的序列到序列列表中.

输出,我想看起来像:

headers =  ['>22567','>34454']
sequences = ['CGTGTCCAGGTCTATCTCGGAAATT...',AAAACTTTGTGAAAA....']

我遇到的问题是当我尝试读取序列部分时,我无法弄清楚如何将每一行连接成一个序列字符串,然后再将其附加到列表中.相反,我拥有的每一行都附加到序列列表中.

我到目前为止的代码是:

#!/usr/bin/python 

import re 

dna = []
sequences = []


def read_fasta(filename):
    global seq,header,dna,sequences 

#open the file  
    with open(filename) as file:    
        seq = ''        
        #forloop through the lines
        for line in file: 
            header = re.search(r'^>w+',line)
            #if line contains the header '>' then append it to the dna list 
            if header:
                line = line.rstrip("n")
                dna.append(line)            
            # in the else statement is where I have problems,what I would like is
            #else: 
                #the proceeding lines before the next '>' is the sequence for each header,#concatenate these lines into one string and append to the sequences list 
            else:               
                seq = line.replace('n','')  
                sequences.append(seq)      

filename = 'gc.txt'

read_fasta(filename)

解决方法

注意:我在我的一个项目上有这个解决方案,所以我直接在这里粘贴它.然而,解决方案不是我的,属于这张海报 here.请提出他/她的回答.感谢 @donkeykong找到原帖

使用列表累积行,直到您获得新ID.然后将这些行连接在一起并将其与id一起存储在字典中.以下函数接受一个打开的文件并生成每对(id,sequence).

def read_fasta(fp):
        name,seq = None,[]
        for line in fp:
            line = line.rstrip()
            if line.startswith(">"):
                if name: yield (name,''.join(seq))
                name,seq = line,[]
            else:
                seq.append(line)
        if name: yield (name,''.join(seq))

with open('ex.fasta') as fp:
    for name,seq in read_fasta(fp):
        print(name,seq)

输出:

('>22567','CGTGTCCAGGTCTATCTCGGAAATTTGCCGTCGTTGCATTACTGTCCAGCTCCATGCCCAACATTTGGCATCGGAGAATGACTCCGCGTGATAAAGTCAGAATAGGCATTGAGACTCAGGGTGGTACCTATTA')
('>34454','AAAACTGTGCAGCCGGTAACAGGCCGCGATGCTGTACTATATGTGTTTGGTACATATCCGATTCAGGTATGTCAGGGAGCCAGCACCGGAGGATCCAGAAGTAAGTCGGGTTGACTACTCCTAGCCTCGTTTCACCATCCGCCGGATAACTCTCCCTTCCATCATCAACTCCTCCCTTTCGTGTCCAATGGGGCGGCGTGTCTAAGCACTGCCATATAGCTACCGAAAGGCGGCGACCCCTCGGA')

这是SO的答案.我会试着找到它并给原始海报一个功劳.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读