使用Python只创建一个Mafft文件

2024-05-23 17:39:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

有几个这样的文件。我想获取我创建的每个文件并通过^{}运行它们,但是当我运行脚本时,它只集中在mafft的一个文件上。我上面提到的文件运行正常,但是当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()

我希望这足够清楚!请帮忙!我试着改变我的缩进,调整关闭文件的时间。大多数情况下,它根本不会生成.mafft文件,有时会生成但不会放入任何内容,但大多数情况下,它只对最后创建的文件有效。在

示例: 代码的开头会创建诸如-

testfile.ATTAC
testfile.AGGAC
testfile.TTAGG

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

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


Tags: 文件sysnewline序列openfnamebarcodeseq
1条回答
网友
1楼 · 发布于 2024-05-23 17:39:10

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

在您的代码中,您将在循环的每次迭代中创建一个输入文件名变量(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()

相关问题 更多 >