根据另一个文件中的共享字段,从一个文件中绘制多个序列

时间:2018-12-11 14:20:06

标签: python bioinformatics biopython fasta

我正在尝试运行一个python脚本,以从另一个程序的输出列表(gene_fams_eggnog.txt)中的一个单独文件(merged.fas)中绘制序列。

代码如下:

from Bio import SeqIO
import os, sys, re
from collections import defaultdict
sequences = "merged.fas"
all_seqs = SeqIO.index(sequences, "fasta")
gene_fams = defaultdict(list)

gene_fams_file = open("gene_fams_eggnog.txt")
for line in gene_fams_file:
     fields = re.split("\t", line.rstrip())
     gene_fams[fields[0]].append[fields[1]]

for fam in gene_fams.keys():
    output_filename = str(fam) + ".fasta"
    outh = open(output_filename, "w")
    for id in gene_fams[fam]:
        if id in all_seqs:
            outh.write(">" + all_seqs[id].description + "\n" + str(all_seqs[id].seq) + "\n")
        else:
            print "Uh oh! Sequence with ID " + str(id) + " is not in the all_seqs file!"
            quit()
    outh.close()

列表如下:

1个酿酒酵母_DAA09367.1
1 bieneu_EED42827.1
1个Asp_XP_749186.1
1个Mag_XP_003717339.1
2 Mag_XP_003716586.1
2 Mag_XP_003709453.1
3 Asp_XP_749329.1

字段0表示基于序列之间的相似性的分组。该脚本旨在从merged.fas中获取与字段1中的代码相对应的所有序列,并将它们写入基于字段0的文件中。

因此,对于我所显示的列表部分,所有在字段0中具有1的序列(Saccharomycescerevisiae_DAA09367.1,bieneu_EED42827.1,Asp_XP_749186.1,Mag_XP_003717339.1)将被写入文件名为1.fasta。这应该从2.fasta继续,但是有很多组。

所以这行得通,但是它不包括该组中的所有序列,而仅包括最后一个作为该组的一部分列出的序列。在上面的示例中,我只有一个带有一个序列(Mag_XP_003717339.1)的文件(1.fasta),而不是全部四个。

感谢您的帮助, 谢谢, JT

1 个答案:

答案 0 :(得分:0)

尽管我没有发现引起您抱怨的问题的原因,但令您惊讶的是,您的代码完全无法运行:

gene_fams[fields[0]].append[fields[1]]

append[...],而不是append(...)。但这也可能是“我正在运行的实际脚本中没有”。我在下面重写了您的脚本,对我来说很好。一个问题是您使用了Python内置的变量名id。您会看到我竭尽全力避免此类错误:

from Bio import SeqIO
from collections import defaultdict

SEQUENCE_FILE_NAME = "merged.fas"
FAMILY_FILE_NAME = "gene_families_eggnog.txt"

all_sequences = SeqIO.index(SEQUENCE_FILE_NAME, "fasta")
gene_families = defaultdict(list)

with open(FAMILY_FILE_NAME) as gene_families_file:
    for line in gene_families_file:
        family_id, gene_id = line.rstrip().split()
        gene_families[family_id].append(gene_id)

for family_id, gene_ids in gene_families.items():
    output_filename = family_id + ".fasta"

    with open(output_filename, "w") as output:
        for gene_id in gene_ids:
            assert gene_id in all_sequences, "Sequence {} is not in {}!".format(gene_id, SEQUENCE_FILE_NAME)

            output.write(all_sequences[gene_id].format("fasta"))