使用Biopython替换文件之间的序列

使用Biopython替换文件之间的序列,python,replace,sequence,biopython,fasta,Python,Replace,Sequence,Biopython,Fasta,我有两个蛋白质序列FASTA文件: nsp.fasta-->原始文件 wsp.fasta-->来自信号肽预测器工具的输出文件,该工具返回nsp.fasta中的蛋白质并去除信号 例如: 在nsp.fasta中记录: >gi|564250271|ref|XP_006264203.1| PREDICTED: apolipoprotein D [Alligator mississippiensis] MRGMLALLAALLGLLGLVEGQTFHMGQCPNPPVQEDFDPSKYLGKWYEIEKL

我有两个蛋白质序列FASTA文件:

nsp.fasta-->原始文件

wsp.fasta-->来自信号肽预测器工具的输出文件,该工具返回nsp.fasta中的蛋白质并去除信号

例如:

在nsp.fasta中记录:

>gi|564250271|ref|XP_006264203.1| PREDICTED: apolipoprotein D [Alligator mississippiensis] MRGMLALLAALLGLLGLVEGQTFHMGQCPNPPVQEDFDPSKYLGKWYEIEKLPSGFEQER CVQANYSLKANGKIKVLTKMVRSAQHLTCLQHRMMLLVSSPVMPASPYWVVATDYENYAL VYSCTSFFWLFHVDYAWIRSRTPQLHPETVEHLKSVLRSYRIQTGMMLPTDQMNCPSDM 但根本没有输出。我尝试将SeqIO.write从循环中取出,它返回一个空白文件。我做错了什么?已经存在合并两个文件或将一个文件中的序列替换为另一个文件中的序列的方法吗

提前谢谢你

塞尔吉奥

编辑代码后,我添加了一个elif子句,试图在nsp.fasta中添加与wsp.fasta不匹配的记录,但不起作用:

to_write = []

for seq1 in SeqIO.parse(r"c:\Users\Sergio\Desktop\nsp.txt", "fasta"):
    for seq2 in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.txt", "fasta"):
        if seq1.id == seq2.id:
            seq1.seq = seq2.seq
            to_write.append(seq1)
        elif seq1.id != seq2.id:
            to_write.append(seq1)

SeqIO.write(to_write, r"c:\Users\Sergio\Desktop\nuevsp.txt", "fasta")

正如您编写的那样,每次编写新序列时,您都会覆盖上一个序列。尝试将记录存储在列表中,然后在循环完成时写出列表

to_write = []
for seq1 in SeqIO.parse(r"c:\Users\Sergio\Desktop\nsp.fasta", "fasta"):
    for seq2 in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta"):
        if seq2.id == seq1.id:
            seq1.seq = seq2.seq
            to_write.append(seq1)
SeqIO.write(to_write, r"c:\Users\Sergio\Desktop\nuevsp.fasta", "fasta")
编辑以建议使用列表理解的另一种方法:

ids_to_save = [x.id for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\nsp.fasta", "fasta")]
records_to_save = [x for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta") if (x.id in ids_to_save)]
SeqIO.write(records_to_save, r"c:\Users\Sergio\Desktop\nuevsp.fasta", "fasta")
编辑以满足“在nsp.fasta中添加与wsp.fasta不匹配的记录”的需要-一般方法,不一定是精确代码:

ids_not_wanted = [x.id for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta")]
records_to_save_2 = [x for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta") if (x.id not in ids_not_wanted)]

records_to_save.append(records_to_save_2)
# If duplicate records are a problem, eliminate them using "set"
records_to_save = list(set(records_to_save))
SeqIO.write(records_to_save, r"c:\Users\Sergio\Desktop\nuevsp.fasta", "fasta")

谢谢你的更正!现在,代码有效地返回了一个有效的输出,但不是预期的结果,因此我的循环逻辑中肯定存在一些错误。有些记录是存储的,有些则不是,即使它们应该存储。据我所知,对于第一个文件中的每个记录,迭代第二个文件中的每个记录,如果ID相同,则替换序列并将其存储在列表中。我说得对吗?有人注意到这个推理有什么错误吗?非常感谢。再次感谢你!实际上,我解决了我所指的问题,只是修复了ID中导致意外不匹配的一些打字错误。我现在需要的是在nsp.fasta中包含wsp.fasta中不存在的记录。我尝试添加和elif(参见我编辑的初始帖子),但它多次返回相同的记录。您的替代解决方案与以前的方法一样工作良好,但没有解决此问题。谢谢非常感谢你!!这是一个完美的解决方案。我真的很感谢你的努力!!“gi | 564250271 | ref | XP | 006264203.1 |”不同于“gi | 564250271 | ref | XP | u 006264203.1 |”。。。。“XP|0”和“XP|0”?是的,这是我在下面评论的打字错误之一。我已经改正了,不过还是要谢谢你!!您不会忘记接受@iayork答案并向上投票;-)哦,对不起,我是新来的,仍然不能控制这种事情。哈哈哈,我已经投票接受了,还没有意识到我必须激活绿色勾号图标。谢谢你的提醒!!
ids_to_save = [x.id for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\nsp.fasta", "fasta")]
records_to_save = [x for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta") if (x.id in ids_to_save)]
SeqIO.write(records_to_save, r"c:\Users\Sergio\Desktop\nuevsp.fasta", "fasta")
ids_not_wanted = [x.id for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta")]
records_to_save_2 = [x for x in SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta") if (x.id not in ids_not_wanted)]

records_to_save.append(records_to_save_2)
# If duplicate records are a problem, eliminate them using "set"
records_to_save = list(set(records_to_save))
SeqIO.write(records_to_save, r"c:\Users\Sergio\Desktop\nuevsp.fasta", "fasta")