我有一个脚本可以对FASTA序列进行排序,按字母顺序排列后面的字符串>。以下是使用单个输入文件35.fas。
的代码示例@INC
fasta文件示例:
import os, sys
import argparse
from Bio import SeqIO
records = list(SeqIO.parse("35.fas", "fasta"))
records.sort(key=lambda x : x.id)
SeqIO.write(records, "35-sorted.fas", "fasta")
正确输出:
>BAR
ATCG
>ABC
TCGA
所以,我想为数百个文件尝试这个并尝试'sys.argv'但是无法这样做。我不希望每个文件都有不同的输出名称* -sorted。只想运行脚本并对扩展名为.fas的文件夹中的所有文件进行排序。 这里的代码不起作用:
>ABC
TCGA
>BAR
ATCG
答案 0 :(得分:2)
您可能错误地使用了sys.argv
,它是所有命令行参数的数组,第一个是正在运行的文件,例如,请查看以下内容:
import sys
for f in sys.argv:
print(f)
当您将文件a.txt,b.txt和c.txt拖到脚本上时,它将打印以下内容(...是省略完整路径):
... / A.TXT
... / b.txt
... / c.txt
您可以在脚本中将其实现为:
import os, sys
import argparse
from Bio import SeqIO
for f in sys.argv[1:]:
records = list(SeqIO.parse(f, "fasta"))
records.sort(key=lambda x : x.id)
SeqIO.write(records, f[:-4] + "-sorted.fas", "fasta")
答案 1 :(得分:1)
使用sys.argv
循环迭代for
中的所有文件名(您应该省略第一个条目,即程序名称)相当容易。然后,您将面临生成输出文件名的问题。我为了论证而假设所有文件名都以'.fas'
结尾。如果情况并非如此,那么字符串操作会有点诡计,但不会太糟糕。
import os, sys
import argparse
from Bio import SeqIO
for filename in sys.argv[1:]:
records = list(SeqIO.parse(filename, "fasta"))
records.sort(key=lambda x : x.id)
outname = filename[:-4]+'-sorted.fas'
SeqIO.write(records, outname, "fasta")
假设这个程序被称为myprog.py
(并且您不在Windows上,可能需要使用glob.glob
函数扩展通配符名称),那么您可以将其称为< / p>
python myprog.py *.fas