一尘不染

使用生成器(python)解析fasta文件

python

我正在尝试解析一个较大的fasta文件,并且遇到内存不足的错误。一些建议,以改善数据处理将不胜感激。当前程序正确打印出名称,但是部分通过文件我得到一个MemoryError

这是发电机

def readFastaEntry( fp ):
    name = ""
    seq = ""
    for line in fp:
        if line.startswith( ">" ):
            tmp = []
            tmp.append( name )
            tmp.append( seq )
            name = line
            seq = ""
            yield tmp
        else:
            seq = seq.join( line )

这是呼叫者存根,这部分工作后会添加更多

fp = open( sys.argv[1], 'r' )

for seq in readFastaEntry( fp ) :
    print seq[0]

对于那些不熟悉fasta格式的人,这里是一个示例

>1 (PB2)
AATATATTCAATATGGAGAGAATAAAAGAACTAAGAGATCTAATGTCACAGTCTCGCACTCGCGAGATAC
TCACCAAAACCACTGTGGACCACATGGCCATAATCAAAAAGTACACATCAGGAAGGCAAGAGAAGAACCC
TGCACTCAGGATGAAGTGGATGATG
>2 (PB1)
AACCATTTGAATGGATGTCAATCCGACTTTACTTTTCTTGAAAGTTCCAGCGCAAAATGCCATAAGCACC
ACATTTCCCTATACTGGAGACCCTCC

每个条目均以“>”开头,说明名称等,然后接下来的N行是数据。除了下一行开头有“>”的行以外,没有定义的数据结尾。


阅读 185

收藏
2020-12-20

共1个答案

一尘不染

您是否考虑过使用BioPython。他们有一个序列读取器,可以读取fasta文件。并且,如果您有兴趣自己编写代码,可以看看BioPython的代码

编辑 :添加代码

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('f.fasta') as fp:
    for name, seq in read_fasta(fp):
        print(name, seq)
2020-12-20