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

时间:2015-10-02 16:47:21

标签: 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]
MRGMLALLAALLGLLGLVEGQTFHMGQCPNPPVQEDFDPSKYLGKWYEIEKLPSGFEQER
CVQANYSLKANGKIKVLTKMVRSAQHLTCLQHRMMLLVSSPVMPASPYWVVATDYENYAL
VYSCTSFFWLFHVDYAWIRSRTPQLHPETVEHLKSVLRSYRIQTGMMLPTDQMNCPSDM

记录在wsp.fasta:

>gi|564250271|ref|XP|006264203.1|  PREDICTED: apolipoprotein D [Alligator mississippiensis]; MatureChain: 21-179
QTFHMGQCPNPPVQEDFDPSKYLGKWYEIEKLPSGFEQERCVQANYSLKANGKIKVLTKM
VRSAQHLTCLQHRMMLLVSSPVMPASPYWVVATDYENYALVYSCTSFFWLFHVDYAWIRS
RTPQLHPETVEHLKSVLRSYRIQTGMMLPTDQMNCPSDM

然而,并非nsp.fasta中的所有蛋白质都含有信号肽,因此wsp.fasta是nsp.fasta中含有信号的蛋白质的子集。我需要的是一个独特的文件,其中包含所有蛋白质记录,包括未发现信号肽的蛋白质和剥离信号肽的成熟链。

我尝试了以下内容:

from Bio import SeqIO

file1 = SeqIO.parse(r"c:\Users\Sergio\Desktop\nsp.fasta", "fasta")

file2 = SeqIO.parse(r"c:\Users\Sergio\Desktop\wsp.fasta", "fasta")

for seq1 in file1:
    for seq2 in file2:
        if seq2.id == seq1.id:
            seq1.seq = seq2.seq
            SeqIO.write(seq1, r"c:\Users\Sergio\Desktop\nuevsp.fasta", "fasta")

但根本没有输出。我已经尝试将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")

1 个答案:

答案 0 :(得分:1)

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

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")