使用record.id解析多行fasta文件的文件名,但不分析标题

时间:2018-11-04 01:00:58

标签: python-3.x parsing split biopython fasta

我当前的多行fasta文件是这样的:

>chr1|chromosome:Mt4.0v2:1:1:52991155:1
ATGC...

>chr2|chromosome:Mt4.0v2:2:1:45729672:1
ATGC...

...等等。

我需要将fasta文件解析为单独的文件,该文件仅在标头(|之后的所有内容)中包含record.description,后跟序列。但是,我需要使用record.ids作为文件名(chr1.fasta,chr2.fasta等)。有什么办法吗?

我目前解决这个问题的尝试如下。它仅在标题中产生描述,最后一个序列record.id作为文件名。我需要单独的文件。

from Bio import SeqIO

def yield_records(in_file):
    for record in SeqIO.parse(in_file, 'fasta'):
        record.description = record.id = record.id.split('|')[1]
        yield record

SeqIO.write(yield_records('/correctedfasta.fasta'), record.id+'.fasta', 'fasta')

1 个答案:

答案 0 :(得分:0)

您的代码几乎包含了所有需要的内容。 yield还可以返回多个值,即您可以同时返回文件名和记录本身,例如

yield record.id.split('|')[0], record

但是BioPython仍然会咬你,因为id被写入了FASTA头。因此,您将需要同时修改id和覆盖description(否则将其串联到id),或者只分配与您相同的值。

一个简单的解决方案是

from Bio import SeqIO

def split_record(record):
    old_id = record.id.split('|')[0]
    record.id = '|'.join(record.id.split('|')[1:])
    record.description = ''
    return old_id, record

filename = 'multiline.fa'

for record in SeqIO.parse(filename, 'fasta'):
    record = split_record(record)
    with open(record[0] + '.fa', 'w') as f:
        SeqIO.write(record[1], f, 'fasta')
相关问题