以列表文件顺序提取fasta序列

时间:2015-02-02 04:23:53

标签: python file-io biopython

我需要从" goodProteins.fasta"中提取一些fasta序列。文件(第一个输入),id列表文件存在于单独的文件夹中(第二个输入)。

fasta序列文件的格式为:

>1_12256
FSKVJLKDFJFDAKJQWERTYU......
>1_12257
SKJFHKDAJHLQWERTYGFDFHU......
>1_12258
QWERTYUHKDJKDJOKK......
>1_12259
DJHFDSQWERTYUHKDJKDJOKK......
>1_12260
ADKKHDFHJQWERTYUHKDJKDJOKK......

其中一个id文件的格式为:

1_12258
1_12256
1_12257

我使用以下脚本:

from Bio import SeqIO
import glob

def process(wanted_file, result_file):
    fasta_file = "goodProteins.fasta" # First input (Fasta sequence)

    wanted = set()
    with open(wanted_file) as f:
        for line in f:
            line = line.strip()
            if line != "":
                wanted.add(line)

    fasta_sequences = SeqIO.parse(open(fasta_file),'fasta')
    with open(result_file, "w") as f:
        for seq in fasta_sequences:
            if seq.id in wanted:
                SeqIO.write([seq], f, "fasta")

listFilesArr = glob.glob("My_folder\*txt") # takes all .txt files as
                                           # Second input in My_folder
for wanted_file in listFilesArr:
    result_file = wanted_file[0:-4] + ".fasta"
    process(wanted_file, result_file)

它应该根据id文件中的信息和顺序列表提取fasta序列,并且所需的输出将是:

>1_12258
QWERTYUHKDJKDJOKK......
>1_12256
FSKVJLKDFJFDAKJQWERTYU......
>1_12257
SKJFHKDAJHLQWERTYGFDFHU......

但我明白了:

>1_12256
FSKVJLKDFJFDAKJQWERTYU......
>1_12257
SKJFHKDAJHLQWERTYGFDFHU......
>1_12258
QWERTYUHKDJKDJOKK......

也就是说,在我的最终输出中,我根据它们的较低值对标题进行排序,但我希望它们的顺序与列表文件中描述的完全相同。我不知道怎么做...请帮忙。

1 个答案:

答案 0 :(得分:0)

我认为排序问题的根本原因是因为wantedset,它们是无序的。由于您希望wanted_file中的序列ID确定排序,因此您需要将它们存储在保留顺序的其他内容中,例如列表。

或者,您可以在阅读时处理wanted_file的每一行。这种方法的一个问题是它需要您多次读取“goodProteins.fasta”文件 - 如果wanted_file的内容不是按排序顺序,则可能对SeqIO.to_dict()的每一行读一次。

为了避免这种情况,可以使用wanted_file函数将整个文件读入一个驻留在内存中的字典,该字典的键是序列ID,然后为每个Process重用。你说这个文件是50-60 MB,但对于今天的大多数硬件来说都不算太多。

无论如何,这里的代码试图这样做。为了避免全局变量,有一个wanted_file类读入“goodProteins.fasta”文件,并在创建它的实例时将其转换为字典。实例是可调用和可重用的,这意味着相同的过程对象可以与每个Bio一起使用,而无需重复读取序列文件。

请注意,代码未经测试,因为我的系统上没有安装数据文件或from Bio import SeqIO import glob class Process(object): def __init__(self, fasta_file_name): # read entire fasta file into memory as a dictionary indexed by ID with open(fasta_file_name, "rU") as fasta_file: self.fasta_sequences = SeqIO.to_dict( SeqIO.parse(fasta_file, 'fasta')) def __call__(self, wanted_file_name, results_file_name): with open(wanted_file_name, "rU") as wanted, \ open(results_file_name, "w") as results: for seq_id in (line.strip() for line in wanted): if seq_id: SeqIO.write(self.fasta_sequences[seq_id], results, "fasta") process = Process("goodProteins.fasta") # create process object # process each wanted file using it for wanted_file_name in glob.glob(r"My_folder\*.txt"): results_file_name = wanted_file_name[:-4] + ".fasta" process(wanted_file_name, results_file_name) 模块 - 但希望它足够接近帮助。

{{1}}