我正在尝试解析一个较大的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行是数据。除了下一行开头有“>”的行以外,没有定义的数据结尾。
您是否考虑过使用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)