解析多行 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')
我当前的多行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')