如何 运行 多个文件的 python 脚本?

How to run the python script for many files?

我有一个脚本可以根据 > 之后的字符串按字母顺序对 FASTA 序列进行排序。这是使用单个输入文件 35.fas.

的代码示例
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")

fasta 文件示例:

>BAR
ATCG
>ABC
TCGA

正确输出:

>ABC
TCGA
>BAR
ATCG

所以,我想尝试对数百个文件进行此操作并尝试 'sys.argv' 但未能成功。我不想为每个文件使用不同的输出名称作为 *-sorted。只想 运行 脚本并对扩展名为 .fas 的文件夹中的所有文件进行排序。 这是无效的代码:

records = list(SeqIO.parse("sys.argv[0]", "fasta"))
records.sort(key=lambda x : x.id)
SeqIO.write(records, "sys.arg[0]-sorted.fas", "fasta")

你可能用错了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")

使用 for 循环遍历 sys.argv 中的所有文件名(您应该省略第一个条目,即程序名称)相当容易。然后剩下的就是生成输出文件名的问题。为了论证,我假设所有文件名都以 '.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 函数扩展通配符名称),那么您将像这样称呼它

python myprog.py *.fas