解析多行 fasta 文件使用 record.id 文件名而不是 headers

Parse multiline fasta file using record.id for filenames but not in headers

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

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

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

...等等。

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

我目前尝试解决这个问题如下。它只生成 header 中的描述,最后一个序列 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')

您的代码几乎包含了所需的一切。 yield 也可以 return 多个值,即您可以 return 文件名和记录本身,例如

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

但是 BioPython 仍然会咬你,因为 id 被写入 FASTA header。因此,您需要修改 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')