Python 按列表文件顺序提取fasta序列
我需要从“goodProteins.fasta”文件(第一个输入)中提取一些fasta序列,id列表文件位于单独的文件夹(第二个输入)中 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
>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毫巴,按照今天的标准,这并没有那个么大……我想我知道你们问题的原因(也许还有一个解决方案)。