如何 运行 多个文件的 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
我有一个脚本可以根据 > 之后的字符串按字母顺序对 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