Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列表文件顺序提取fasta序列_Python_File Io_Biopython - Fatal编程技术网

Python 按列表文件顺序提取fasta序列

Python 按列表文件顺序提取fasta序列,python,file-io,biopython,Python,File Io,Biopython,我需要从“goodProteins.fasta”文件(第一个输入)中提取一些fasta序列,id列表文件位于单独的文件夹(第二个输入)中 fasta序列文件的格式为: >1_12256 FSKVJLKDFJFDAKJQWERTYU。。。。。。 >1_12257 SKJFHKDAJHLQWERTYGFDFHU。。。。。。 >1_12258 QWERTYUHKDJKDJOKK。。。。。。 >1_12259 DJHFDSQWERTYUKKDJKOKK。。。。。。 >1_12260 ADKKHDFHJQ

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

fasta序列文件的格式为:

>1_12256
FSKVJLKDFJFDAKJQWERTYU。。。。。。
>1_12257
SKJFHKDAJHLQWERTYGFDFHU。。。。。。
>1_12258
QWERTYUHKDJKDJOKK。。。。。。
>1_12259
DJHFDSQWERTYUKKDJKOKK。。。。。。
>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。。。。。。

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

我认为订购问题的根本原因是因为
想要的
是一个
集合
,没有订购。由于您希望
wanted\u文件
s中的序列ID确定顺序,因此需要将它们存储在其他保留顺序的文件中,如列表

或者,您也可以在读取时处理
所需的\u文件的每一行。这种方法的一个问题是,可能需要您多次阅读“goodProteins.fasta”文件,如果文件的内容没有按排序顺序排列,则可能需要对
所需文件的每一行读取一次

为了避免这种情况,可以使用
SeqIO.To_dict()
函数一次将整个文件读入内存驻留字典,其键是序列ID,然后对每个
想要的文件重新使用。您说文件大小为50-60MB,但对于当今的大多数硬件来说,这并不算多

不管怎样,这里有一些代码试图做到这一点。为了避免全局变量,有一个
进程
类读取“goodProteins.fasta”文件,并在创建其实例时将其转换为字典。实例是可调用和可重用的,这意味着相同的流程对象可以用于每个
所需的\u文件
s,而无需重复读取序列文件

请注意,代码未经测试,因为我的系统上没有安装数据文件或
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)

你的问题中代码的缩进搞砸了。您的意思是希望每个
结果文件
中的序列id顺序与正在处理的相应
所需文件
中的序列id顺序相同吗?goodProteins.fasta”文件有多大?是的。。我希望每个结果\u文件中的序列id顺序与相应的所需\u文件中的顺序相同。。而且goodProteins.fasta文件很大。。大约50-60毫巴,按照今天的标准,这并没有那个么大……我想我知道你们问题的原因(也许还有一个解决方案)。