我需要从" 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......
也就是说,在我的最终输出中,我根据它们的较低值对标题进行排序,但我希望它们的顺序与列表文件中描述的完全相同。我不知道怎么做...请帮忙。
答案 0 :(得分:0)
我认为排序问题的根本原因是因为wanted
是set
,它们是无序的。由于您希望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}}