Python 在fasta中添加“N”并连接数百万个序列的最快方法

Python 在fasta中添加“N”并连接数百万个序列的最快方法,python,macos,biopython,Python,Macos,Biopython,我想连接fasta文件中的所有序列,在序列之间插入固定数量的Ns。我试图通过在fasta文件中的所有序列中添加一堆Ns,然后根据食谱使用biopython连接更改的序列来实现这一点。然而,我的代码在记录发生更改时打印出每个记录,最后打印出连接版本,而我只希望打印出后者。如果有人能指出我代码中的错误或提出更好的方法,我将不胜感激。谢谢 更新:我按照Celeo的建议更正了代码,但是处理超过1200万个序列的实际文件需要很长的时间。有没有一种更快更有效的方法使用其他语言perl/awk来实现这一点?

我想连接fasta文件中的所有序列,在序列之间插入固定数量的Ns。我试图通过在fasta文件中的所有序列中添加一堆Ns,然后根据食谱使用biopython连接更改的序列来实现这一点。然而,我的代码在记录发生更改时打印出每个记录,最后打印出连接版本,而我只希望打印出后者。如果有人能指出我代码中的错误或提出更好的方法,我将不胜感激。谢谢

更新:我按照Celeo的建议更正了代码,但是处理超过1200万个序列的实际文件需要很长的时间。有没有一种更快更有效的方法使用其他语言perl/awk来实现这一点? 这是一个示例输入

$ cat test.fa
>read_1
GAAGTACGT
>read_2
AACTCAAGAACAAGAAAAAA
>read_3
TGGACGACCATTCATGGCGACGTCAAGGTCAATCAT
这是我的密码:

$cat merge_seq.py
import sys
from Bio import SeqIO
from Bio.Seq import Seq
in_file = open(sys.argv[1],'r')
sequences = SeqIO.parse(in_file, "fasta")
concat=Seq("")
for record in sequences:
    record.seq= record.seq + ("N" * 20)
    concat+=record.seq
    print concat
这是电流输出:

$ python merge_seq.py test.fa 
GAAGTACGTNNNNNNNNNNNNNNNNNNNN
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNN
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNNTGGACGACCATTCATGGCGACGTCAAGGTCAATCATNNNNNNNNNNNNNNNNNNNN
完成所有附加后,在for循环外部打印concat变量

输出:

$ python merge_seq.py test.fa
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNNTGGACGACCATTCATGGCGACGTCAAGGTCAATCATNNNNNNNNNNNNNNNNNNNN
我的电脑中有一个包含100万条记录的FASTA文件,您的代码只需几分钟

您可以尝试的第一种方法是将每个序列附加到列表中,然后使用nnnn加入列表需要13秒:

或者,如果只需要1.6秒,您就可以删除Biopython,或者将连接序列加载到另一个Seq对象中:


这是有效的——这是一个明显的错误:但是对于我的实际数据~1200万个序列,这段代码不是很快,你有什么建议可以加快处理速度吗?谢谢你可以将record.seq=record.seq+N*20和concat+=record.seq组合到concat+=record.seq+N*20我不知道这会为你节省很多,但最好不要做额外的步骤。
$ python merge_seq.py test.fa
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNNTGGACGACCATTCATGGCGACGTCAAGGTCAATCATNNNNNNNNNNNNNNNNNNNN
sequences = SeqIO.parse("1Million.fas", "fasta")
seqs = []

for sequence in sequences:
    seqs.append(sequence.seq)

"NNNNNNNNNN".join(seqs)
seqs = []

with open("1Million.fas") as fasta:
    prev_seq = []
    for line in fasta:
        if line.startswith(">"):
            seqs.append("".join(prev_seq))
            prev_seq = []
        else:
            prev_seq.append(line.rstrip())

# This appends the lines after the last ">"
seqs.append("".join(prev_seq))

"NNNNNNNNNN".join(seqs)