Mafft 仅使用 Python 创建一个文件

Mafft only creating one file with Python

所以我正在做一个项目来对齐序列 ID 和它的代码。我得到了一个条形码文件,其中包含一个 DNA 序列的标签,即 TTAGG。有几个标签(ATTAC、ACCAT 等)然后从序列文件中删除并放置在序列 ID 中。 示例:

sequence file --> SEQ 01  TTAGGAACCCAAA
barcode file --> TTAGG

我想要的输出文件将删除条形码并用它来创建一个新的fasta格式文件。 例子: testfile.TTAGG 打开后应该有

>SEQ01
AACCCAAA

有几个这样的文件。我想获取我创建的每个文件并 运行 它们通过 mafft,但是当我 运行 我的脚本时,它只集中在一个文件上 mafft。我上面提到的文件可以正常显示,但是当 mafft 运行s 时,它只是 运行s 最后创建的文件。

这是我的脚本:

#!/usr/bin/python

import sys
import os

fname = sys.argv[1]
barcodefname = sys.argv[2]

barcodefile = open(barcodefname, "r")
for barcode in barcodefile:
        barcode = barcode.strip()
        outfname = "%s.%s" % (fname, barcode)
        outf = open(outfname, "w+")
        handle = open(fname, "r")
        mafftname = outfname + ".mafft"
        for line in handle:
                newline = line.split()
                seq = newline[0]
                brc = newline[1]
                potential_barcode = brc[:len(barcode)]
                if potential_barcode == barcode:
                        outseq = brc[len(barcode):]
                        barcodeseq = ">%s\n%s\n" % (seq,outseq)
                        outf.write(barcodeseq)
        handle.close()
        outf.close()
cmd = "mafft %s > %s" % (outfname, mafftname)
os.system(cmd)
barcodefile.close()

我希望你说得够清楚了!请帮忙!我试过更改缩进,在关闭文件时进行调整。大多数时候它根本不会创建 .mafft 文件,有时它会创建但不会放入任何东西,但大多数情况下它只适用于最后创建的文件。

示例: 代码的开头创建文件,例如 -

testfile.ATTAC
testfile.AGGAC
testfile.TTAGG

然后当它 运行s mafft 它只创建 testfile.TTAGG.mafft(输入正确)

我试过关闭 outf 文件然后再次打开它,它告诉我我正在强制它。 我已将 outf 文件更改为仅写入,不会更改任何内容。

mafft之所以只对齐最后一个文件file是因为它的执行是在循环外的。

按照您的代码,您在循环的每次迭代中创建一个输入文件名变量 (outfname),但该变量总是在下一次迭代中被覆盖。因此,当您的代码最终到达 mafft 执行命令时,outfname 变量将包含循环的最后一个文件名。

要更正此问题,只需在循环中插入 mafft 执行命令:

#!/usr/bin/python

import sys
import os

fname = sys.argv[1]
barcodefname = sys.argv[2]

barcodefile = open(barcodefname, "r")
for barcode in barcodefile:
        barcode = barcode.strip()
        outfname = "%s.%s" % (fname, barcode)
        outf = open(outfname, "w+")
        handle = open(fname, "r")
        mafftname = outfname + ".mafft"
        for line in handle:
                newline = line.split()
                seq = newline[0]
                brc = newline[1]
                potential_barcode = brc[:len(barcode)]
                if potential_barcode == barcode:
                        outseq = brc[len(barcode):]
                        barcodeseq = ">%s\n%s\n" % (seq,outseq)
                        outf.write(barcodeseq)
        handle.close()
        outf.close()
        cmd = "mafft %s > %s" % (outfname, mafftname)
        os.system(cmd)

barcodefile.close()