如何为许多文件运行python脚本?

时间:2017-08-04 15:25:14

标签: python biopython

我有一个脚本可以对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

2 个答案:

答案 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